リンク
[ 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;
}