CF1917 C Watering an Array

发布时间 2023-12-25 23:09:56作者: Simex

Link

首先我们研究全是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;
}