C. System Testing

链接

[https://codeforces.com/contest/1121/problem/C]

题意

CF测评机子,有k个。对于每个解都有测试数据的数量。
可以同时测试k个不同的解。
有趣的解定义
有趣的方案:当前的进度d=[100*m/n] (四舍五入取整),m是已经测试完的方案,如果此时恰好有一个方案处理到第d个测试点,则该方案为有趣的方案。

分析

这就是个模拟题。你只需仔细分析,注意细节即可。
我是枚举时间。不过我跳进了一个大坑。
对于完成的测试,在下一秒开始才会生效。比如49秒完成1.第50秒开始才生效。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+10;
const int ma=15e4+10;
int a[N],vis[N],st[N],ok[N];

int main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int n,k;
	while(cin>>n>>k){
		
		memset(vis,0,sizeof(vis));
		memset(ok,0,sizeof(ok));
		memset(st,0,sizeof(st));
	    int ans=0;
	    
		for(int i=1;i<=n;i++)
			cin>>a[i];
		
		
		int up=k;
		int cur=0,la=0;
		
		
		
		for(int i=1;i<=ma+1;i++){
			
		   la=0;
			int p=int((cur*100.0/n)+0.5);//当前检查率
			 
			 for(int j=1;j<=min(up,n);j++){//检查有多少满足要求的测试 
			 	if(!vis[j]){//是否完成测试过了 
			 		if(i-st[j]==p&&!ok[j]){//避免重复 
			 			ans++;
			 			cout<<i<<' '<<j<<endl;
			 			ok[j]=1;
					 }
				 }
			 }
			 
			 
			  
			 
			 
			 for(int j=1;j<=min(up,n);j++){//检查当前时间完成测试的 
			 	 if(i-st[j]==a[j]){
			 	 	vis[j]=1;
			 	 	la++;
				  } 
			 }
			 cur+=la;
			 up+=la;
			 for(int j=1;j<=min(up,n);j++)//这一时刻进来的标记开始的时间 
			 if(!st[j]&&j>k) st[j]=i; 
		}

      cout<<ans<<endl;
	}
	return 0;
}

别人的代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int a[N],b[N],c[N],vis[N];
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i]; 
	for(int i=1;i<=k;i++)
		b[i]=a[i];
		
	int task=0,cur=k+1,ans=0;
	
	while(task<n){
		int q=task*100.0/n+0.5;
		
		for(int i=1;i<=k;++i){
			if(!b[i]) continue;
			c[i]++;
			if(c[i]==q&&!vis[i])
			ans++,vis[i]=1;
			
			if(c[i]==b[i]){
				task++;
				vis[i]=0;
				c[i]=0;
				b[i]=a[cur];
				cur++;
			}
		}
		
	}
	cout<<ans<<endl;
	return 0;
}
posted @ 2019-06-08 21:30  ChunhaoMo  阅读(220)  评论(0编辑  收藏  举报