1917C - Watering an Array

原题链接:Watering an Array

思路:

首先我们想一下如果数组a全为0,那么我不管怎么加,这个数组永远是单调不递增的,换句话来说,因为要和1,2,3,4。。。匹配,所以不管怎么加1,最多只有一个数能与之匹配,考虑贪心的想法,只要第一个数a[1]=1即可,也就是说第一次清0,第二次加1。。。循环,此时c增加的次数即为剩余d次数/2向下取整。

那么数组a为0的情况已经考虑完了,那么就考虑初始的数组a,显然a不管加多少次1,c永远小于等于n,这相当于先把数组a清0,然后循环上面的步骤,得到最多2*n+1次时也同样可以达到n,那么可以一次次循环第一次应该加多少次1清空,最大循环2*n次。

代码附上:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N =1e5+5;
int a[N],b[N];
int n,k,d;

void solve(){
    cin>>n>>k>>d;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=k;i++)cin>>b[i];
    
    int ans=0;
    for(int i=0;i<=min(d-1,2*n);i++){
        int c=0;
        for(int j=1;j<=n;j++){//清空
            if(j==a[j])c++;
        }

        int less=d-i-1;
        c+=less/2;
        ans=max(ans,c);

        for(int j=1;j<=b[(i)%k+1];j++){//加
            a[j]+=1;
        }
    }
    cout<<ans<<"\n";
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t;cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值