Watering an Array

原题链接

题解

由于执行收获操作后所有数组清零,清零后的数组最快捷的加分方法是加一收获一,所以就是第一次加多少次
然后第一次加完最多收获 n 分,相当于清零后执行总共 2n 次 所以只需要判断第一次加 &[0,2n-1]& 次加后收获时能收获多少就行了

code,注意细节

#include<bits/stdc++.h>
using namespace std;
int a[2005]={0},b[100005]={0};
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,k,d;
        cin>>n>>k>>d;

        int cnt=0,ans=0;
        for(int i=1;i<=n;i++)cin>>a[i];

        for(int i=1;i<=k;i++)cin>>b[i];

        for(int i=0;i<=min(d-1,2*n-1);i++)
        {
            for(int j=1;j<=n;j++) cnt+=(a[j]==j);

            ans=max(ans,cnt+(d-i-1)/2);//i代表第一次加i次后再收获最终能得到的分数

            for(int j=1;j<=b[i%k+1];j++) a[j]++;
            cnt=0;
        }

        cout<<ans<<endl;
    }
    return 0;
}

posted @   纯粹的  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示