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;
}

posted @ 2025-05-07 22:31  Marinaco  阅读(28)  评论(0)    收藏  举报
//雪花飘落效果