Codeforces Round 917 (Div. 2)---C. Watering an Array---纯数学

 

Codeforces Round 917 (Div. 2)---C. Watering an Array---纯数学_第1张图片

思路:每天只能使用一次1或2,一旦使用了2,则数组a全为0,最多2天加1,则寻找最开始数组前i天分加上(d-i-1)/2分,从而暴力枚举一遍,减一是因为使用2需要一天!

#include
using namespace std;
using ll = long long;
void solve()
{
	ll n,k,d;cin>>n>>k>>d;
	ll cnt=0,ans=0;
	vectora(n+1),v(k+1);
	for(ll i=1;i<=n;i++) cin>>a[i];
	for(ll i=1;i<=k;i++) cin>>v[i];
	for(ll i=1;i<=n;i++)
	{
		if(a[i]==i) cnt++;
	}
	ans=cnt+(d-1)/2;//第一天使用2,然后相加
	//开始每天累加,看第一次使用2与(d-i-1)/2的最大值
	for(ll i=1;i<=min(2*n,d-1);i++)//d-1是因为加分需要消耗1天
	{
		ll b=v[(i-1)%k+1];
		cnt=0;
		for(ll j=1;j<=b;j++)
		{
			a[j]++;
		}
		for(ll j=1;j<=n;j++)
		{
			if(a[j]==j) cnt++;
		}
		ans=max(ans,cnt+(d-i-1)/2);//-1因为需要消耗1天
	}
	cout<>t;
	while(t--) solve();
	return 0;
}

你可能感兴趣的:(c++,算法)