[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;
}
原文:https://www.cnblogs.com/mch5201314/p/10991776.html