题意:
给出n个解决方案,一个方案要通过ai个测试点,可以同时处理k个方案,问有趣的方案个数。
有趣的方案:当前的进度d=[100*m/n] (四舍五入取整),m是已经测试完的方案,如果此时恰好有一个方案处理到第d个测试点,则该方案为有趣的方案。
思路:
观察数据可以看到ai<=150,我们可以暴力枚举秒,每秒来模拟。记录一下当前处理的k个任务,以及每个任务处理到第几个测试点。每秒判断一个这k个任务是否有满足条件的就行了。注意一个方案只能算一次,不要重复算。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
typedef vector<int>vi;
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define fi first
#define se second
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" " ;
#define pb(x) push_back(x)
#define per(i,a,b) for(int i=(b)-1;i>=(a);--i)
const int N=2e5+5;
int a[N],b[N],c[N],vis[N];
int main()
{
int n,k;
cin>>n>>k;
rep(i,1,n+1)
cin>>a[i];
rep(i,1,k+1)
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;
}