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;
}

猜你喜欢

转载自www.cnblogs.com/mch5201314/p/10991776.html