CF1917 C Watering an Array
首先我们研究全是0的情况,显然的,每次操作2最多可以得到1分。
那么显然的,不如直接一次操作一一次操作二,这样是最优的。
然后再研究初始数组,很难用很快的方式得到应该从什么时候开始第一次操作二。
不过可以注意到,第一次操作2最多可以得到n分,那么我们再\(2n+1\)天以后进行第一次操作二,那还不如再第一天就进行操作二。
所以最多需要计算\(2n\)天的答案。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<bitset>
#define int long long
using namespace std;
int t;
int v[100005];
int n,k,d;
int a[100005];
signed main(){
scanf("%lld",&t);
while(t--){
long long ans=0;
scanf("%lld%lld%lld",&n,&k,&d);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
for(int i=0;i<k;++i)
scanf("%lld",&v[i]);
for(int i=1;i<=2*n+1&&i<=d;++i){
int cnt=0;
for(int j=1;j<=n;++j)
cnt+=(a[j]==j);
ans=max(ans,(long long)cnt+(d-i)/2);
for(int j=1;j<=v[(i-1)%k];++j)
a[j]++;
}
printf("%lld\n",ans);
}
return 0;
}