思路:
首先我们想一下如果数组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;
}