ICPC网络预选赛(第二场)(一)

ICPC网络预选赛(二)部分题目解析

ICPC网络预选赛(第二场)(一)


题目链接

F Tourist
题目大意

初始值为sum=1500,接下来会有n个回合,每个回合sum+=a_i,求出sum>=4000的回合,如果没有找到这样的回合返回-1

题解思维

签到题,按着题目大意来即可

解题代码
#include<bits/stdc++.h> 
using namespace std;
using ll = long long;
int main()
{
	int n;
	ll sum = 1500;
	cin>>n;
	ll t;
	for(int i=1;i<=n;i++)
	{
		cin>>t;	
		sum+=t;
		if(sum>=4000)
		{
			cout<<i<<"\n";
			return 0;
		}
	}
	cout<<-1<<"\n";
	return 0;
}
J Stacking of Goods
题目大意

将一堆物品竖着一个个堆叠起来,求出被压缩后最小的体积。

题解思维

采用贪心的策略,由于我们希望将体重大的物体放在最上面,压缩率大的物体放在最下面。
不妨将每个物体的 c i / w i 当作被希望放在最下面的权重, c 越大起正向影响, w 越大起负向影响。 不妨将每个物体的c_i/w_i当作被希望放在最下面的权重,c越大起正向影响,w越大起负向影响。 不妨将每个物体的ci/wi当作被希望放在最下面的权重,c越大起正向影响,w越大起负向影响。
由此将物体进行排序后,根据顺序,将物体一个个堆叠即可

解题代码
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Good {
    long long weight;
    long long volume;
    long long compression;
    Good(long long w, long long v, long long c) : weight(w), volume(v), compression(c) {}
};

// 比较器,用于按照ci/wi排序 考虑到浮点数的影响
bool compare(const Good& a, const Good& b) {
    return a.compression * b.weight < b.compression * a.weight;
}

int main() {
    int n;
    cin >> n;
    
    vector<Good> goods;
    
    for (int i = 0; i < n; ++i) {
        long long w, v, c;
        cin >> w >> v >> c;
        goods.emplace_back(w, v, c);
    }
    
    // 按照压缩系数与重量的比值排序
    sort(goods.begin(), goods.end(), compare);
    
    long long totalWeight = 0;
    long long totalVolume = 0;

    // 计算总的实际体积
    for (const auto& good : goods) {
        totalVolume += good.volume - good.compression * totalWeight;
        totalWeight += good.weight;
    }
    
    cout << totalVolume << endl;

    return 0;
}
/*
3
1 8 1
2 9 2
3 10 2
*/
I Strange Binary
题目大意

尝试找到能按特定规律组合的a_i使得=n

解题思维

考虑到相邻的两个bit位,大位是小位的两倍,根据这个性质来解题

#include<bits/stdc++.h>
using namespace std;
using uint = unsigned int;

void solve()
{
	//首先读取要求的数
	uint n;
	cin>>n;
	vector<int> res(31); 
    //得到每个位
	for(int i=31;i>=0;i--)res[i] = (n>>i)&1; 
    //当前者与后者满足1,0关系时,采用上面的性质,进行等价替换
	for(int i=0;i<31;i++)if(res[i]==1&&res[i+1]==0)res[i]=-1,res[i+1]=1;
	bool find = 0;
    //如果还有连续的两个00说明,表明该数不能生成满足条件的序列。
	for(int i=0;i<31;++i)if(res[i]==0&&res[i+1]==0) find =1;
	if(find)cout<<"NO\n";
	else 
	{
		cout<<"YES\n";
		for(int i=1;i<=4;++i){
				for(int j=0;j<8;++j){
					cout<<res[(i-1)*8+j]<<' ';
				}
				cout<<'\n';
			}
	}
}
int main()
{
	int t;
	cin>>t;
	while(t--) solve();
} 
A Gambling on Choosing Regionals
题目大意

本题目的含义就是,有多场比赛,且对每个学校有限制名额,每个队只能参加两次,实力值高的队伍排名高,现在要我们求出最坏情况下,每个队的最小排名。

题解思维

什么是最坏情况,当然就是你参加比赛的时候,你之前所有的强队都在【也就是要保证这个队伍存在,且给它匹配高手】。那怎么得到最小排名呢【也就是参加比赛参加的人数越少那么自然的排名也就越小】 排名越小指的就是排名越好,实力最强排1,实力次强排2,1<2,更小的排名意味着更好。

解题代码
#include<bits/stdc++.h> 
using namespace std;
//定义一个队的相关信息结构体
typedef struct no
{
	int val;
	string id;
	int index;
}no;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
	int n,k;
	cin>>n>>k;
	vector<no> a(n) ;
    //用于找到允许参赛的最小名额
	int mins=0x3f3f3f3f;
	int t;
	while(k--)
	{
		cin>>t;
		if(t<mins) mins = t;
	}
	for(int i=0;i<n;i++)
	{
		cin>>a[i].val>>a[i].id;
		a[i].index=i;
	}
	auto cmp = [](no& a,no &b){return a.val>b.val;};
    //按照实力值进行排序,
	sort(a.begin(),a.end(),cmp);
    //用于记录一个队当前已经参加的队伍数量
	unordered_map<string,int> mp;
    //记录最好名次
	vector<int> ans(n) ;
    //记录当前比赛能达到的最好名词
	int rank=0;
    //降序保证了排名的准确
	for(int i=0;i<a.size();i++)
	{
        //该校参赛名额未满
		if(mp[a[i].id]<mins)
		{
			mp[a[i].id]++;
			rank++;
			ans[a[i].index]=rank;
		}
        //该校参赛名额满了,但为了保证该队能参赛,那么可以理解为它替换了当前参赛的最后一个队
		else
		{
			ans[a[i].index]=rank;
		}
	}
    //输出答案即可
	for(int i=0;i<n;i++)
	{
		cout<<ans[i]<<"\n";
	}
}
/*
5 3
1 2 3
100 THU
110 PKU
95 PKU
105 THU
115 PKU
*/
### 关于2024 ICPC网络预选赛的信息 #### 参赛规则 国际大学生程序设计竞赛(ICPC)作为项全球性的赛事,其参赛规则通常保持定的稳定性。根据以往的经验和惯例[^1],每支参赛队伍由三名队员组成,他们需在同台计算机上合作完成系列算法问题的解答。比赛期间不允许使用任何外部资源或工具书,仅能依赖团队成员的知识储备以及现场提供的少量参考资料。 对于具体的2024年ICPC网络预选赛而言,虽然官方尚未发布详细的最新规定,但可以推测基本框架不会发生显著变化。例如,在线形式可能继续沿用近年来因疫情而普及的方式;同时也会严格监控作弊行为以维护公平竞争环境[^2]。 #### 时间安排 关于2024年的具体时间表目前还没有确切消息公布出来。然而按照传统模式来看,整个流程般会经历以下几个阶段: - **报名期**:预计会在年初开放注册通道供各高校提交候选名单。 - **区域选拔赛/网络挑战赛**:这通常是多轮次举行,覆盖不同大洲和地区的时间段以便更多选手参与进来体验实战氛围并争取晋级机会。 - **全球总决赛准备阶段**:成功突围进入最终环节者将获得额外培训指导来提升实力迎接巅峰对决时刻。 以下是基于历史数据猜测的个大致日程示例(请注意实际日期应参照官方通知为准): | 阶段 | 开始日期 | 结束日期 | |--------------------|---------------|----------------| | 报名截止 | 2024-02-15 | | | 初步筛选结果公告 | | 2024-03-01 | | 第网络资格赛 | 2024-03-10 | 2024-03-12 | | 复活赛 | 2024-04-07 | 2024-04-09 | | 半决赛分区 | 各区自行决定 | 各区自行决定 | #### 题目解析 由于正式试题还未出炉之前无法提供针对性分析,不过可以根据往届经典案例来进行些通用技巧分享: ```python def example_problem(): """ 假设有道简单的字符串匹配问题. 给定两个长度不超过1e6 的字符串S 和T(S >= T),判断是否存在子串使得两者完全致. 如果存在返回True;否则False. """ from collections import defaultdict def kmp_preprocess(pattern): lps = [0]*len(pattern) j=0;i=1; while i<len(pattern): if pattern[i]==pattern[j]: lps[i]=j+1;j+=1;i+=1; elif j!=0: j=lps[j-1]; else : lps[i]=0;i+=1 return lps; s="abcde";t="bcd"; lps=kmp_preprocess(t); q=[]; res=False; for char in s: while(q and (not t[len(q)]==char)): last=len(q)-lps[-1];q=q[:last]; if not q or t[len(q)]==char:q.append(char); if ''.join(q)==t:res=True;break; print(res) example_problem() ``` 上述代码片段展示了个利用KMP算法解决字符串查找的经典方法之。当然这只是众多可能性中的很小部分而已。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值