E - Bowls and Beans
题目链接:https://atcoder.jp/contests/abc404/tasks/abc404_e
题意:
给定n个碗,(除了0碗)碗上有标记,标记数组为c[i]
每个碗里面有a[i]个豆子
每次可以选择一个碗,使得碗里面任意个豆子在i-c[i],i-c[i]+1,....i-1区间内自由分配
求使得所有豆子都放入0碗所需的操作次数
思路:
发现豆子是从后往前传递的,而且从一个碗传递到另外一个碗是最优的
贪心难以保证正确性,所以需要用线性dp
设f[i]:将第i个碗里面的豆子倒入0碗所需的操作数
所以对于j:[i-c[i],i-1]
f[i]=min(f[i],f[j]+1)
当这个碗里面有豆子时,先对答案进行累加再设置f[i]=0,因为这个碗里面的豆子可以通过后面的放入0碗
void solve(){
int n;cin>>n;
vector<int>a(n+1);
vector<int>b(n+1);
rep(i,1,n-1)cin>>a[i];
rep(i,1,n-1)cin>>b[i];
vector<int>f(n+1,llmax);
vector<int>path(n+1);
path[0]=-1;
f[0]=0;
int ans=0;
for(int i=1;i<=n-1;i++){
for(int j=max(0ll,i-a[i]);j<=i-1;j++){
f[i]=min(f[i],f[j]+1);
}
if(b[i]){
ans+=f[i];
f[i]=0;
}
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号