C.システムテスト

リンク

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

問題の意味

CFの評価機、kがあります。各溶液のためのテストデータの数を有しています。
Kさまざまなソリューションを同時にテストすることができます。
興味深い溶液定義
興味深い解決策:現在の進捗D = 100×M / N (] D番目の試験点にまさにこの時の処理プログラム場合は整数に丸め)は、mがプログラムは、試験を終了したれますプログラムは、興味深いプログラムです。

分析

これは、シミュレーションの質問です。あなただけ慎重に分析する必要があり、細部へのこだわりができます。
私は、列挙時間です。しかし、私はピットに飛び込みました。
完全なテストのために、次の秒で有効になり始めました。1.例えば、49秒を有効にするには始めて最初の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