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

 

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

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
	ll n,k,d;cin>>n>>k>>d;
	ll cnt=0,ans=0;
	vector<ll>a(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<<ans<<'\n';
}
int main()
{
	ll t;cin>>t;
	while(t--) solve();
	return 0;
}

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值