专栏文章

题解:P13394 [GCJ 2010 #1B] Picking Up Chicks

P13394题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio3j2a3
此快照首次捕获于
2025/12/02 12:46
3 个月前
此快照最后确认于
2025/12/02 12:46
3 个月前
查看原文

答题思路

贪心练习题。如果有一只鸡可以在 TT 时刻到达谷仓,也就是 xi+vi×TBx_{i}+ v_{i}\times T\ge B ,则记录它为可以经过的鸡。如果这只鸡前面有不能到达的鸡挡着他,那么对这些鸡全部操作一遍,以确保它可以到达终点。特别的,这一只鸡前面的另一只可以通过的鸡是不需要操作的,因为跟着前面那只鸡也可以到达终点。最后当已经有 kk 只鸡经过终点,就可以输出了。对于代码实现,由于需要看这只鸡前面的无法通过的鸡的数量,所以需要倒序枚举。

代码展示

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int c,x[100];
int v[100];
bool bl[100];
signed main()
{
	cin>>c;
	for(int T=1;T<=c;T++)
	{
		int n,k,b,t
		int tmp=0,sum=0,ans=0;
		//分别表示 
		//不可能走到谷仓的鸡的数量
		//已经有几只鸡到达了
		//答案统计 
		memset(bl,0,sizeof(bl));//多测清空
		cin>>n>>k>>b>>t;
		for(int i=1;i<=n;i++) cin>>x[i];
		for(int i=1;i<=n;i++)
		{
			cin>>v[i];
			if(x[i]+v[i]*t>=b) bl[i]=1;//打标记 
		}
		for(int i=n;i>=1;i--)
		{
			if(sum>=k) break;//当已经有k只鸡通过,直接跳出循环 
			if(bl[i]) ans+=tmp,sum++;//如果被标记,前面不可能走到谷仓的鸡全部操作一遍 
			else tmp++;//没被标记,计数 
		}
		cout<<"Case #"<<T<<": ";
		if(sum<k) cout<<"IMPOSSIBLE"<<endl;//无解 
		else cout<<ans<<endl;
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...