1. 程式人生 > >Codeforces 922E Birds

Codeforces 922E Birds

題意:有一排n棵樹,每棵樹木上有ci只鳥,每次從一棵樹上召喚一隻鳥要消耗costi魔力,同時,每召喚一隻鳥,召喚鳥的魔力消耗都會增加B.一個人初始有W魔力,每到一顆新的樹下,會獲得X魔力,同時這個人只能從左往右走。問最多召喚鳥的數目

思路:動態規劃,設定狀態dp[i][j]表示在第i棵樹下,已經召喚j只鳥所需要消耗最少的魔力。狀態轉移即可


#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
const ll MAXN = 1e5
; ll dp[2][MAXN]; ll cst[MAXN]; ll bird[MAXN]; int n; ll w,b,x; int up=0; int main() { ios::sync_with_stdio(false); while(cin>>n>>w>>b>>x) { up=0; for(int i=0;i<n;i++) { cin>>bird[i]; up+=bird[i]; } for
(int i=0;i<n;i++)cin>>cst[i]; memset(dp,-1,sizeof dp); int p=0; dp[p][0]=w; for(int i=0;i<n;i++) { // cout<<bird[i]<<endl; // cout<<up<<endl; for(int j=0;j<=up;j++) { // cout<<"ff"<<endl;
if(dp[p][j]==-1)continue; for(int k=0;k<=bird[i];k++) { if(k*cst[i]>dp[p][j])break; if(dp[p^1][k+j]==-1) dp[p^1][k+j]=min(dp[p][j]-k*cst[i]+x,w+(k+j)*b); else dp[p^1][k+j]=max(dp[p^1][j+k],min(dp[p][j]-k*cst[i]+x,w+(k+j)*b)); } } p^=1; // cout<<p<<endl; } int ans=0; for(int i=0;i<=up;i++)if(dp[p][i]!=-1)ans=i; cout<<ans<<endl; } }