Codeforces 922E Birds
阿新 • • 發佈:2019-01-10
題意:有一排棵樹,每棵樹木上有只鳥,每次從一棵樹上召喚一隻鳥要消耗魔力,同時,每召喚一隻鳥,召喚鳥的魔力消耗都會增加.一個人初始有魔力,每到一顆新的樹下,會獲得魔力,同時這個人只能從左往右走。問最多召喚鳥的數目
思路:動態規劃,設定狀態表示在第棵樹下,已經召喚只鳥所需要消耗最少的魔力。狀態轉移即可
#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;
}
}