博弈思想,从后往前推,因为总钱数不变,所以每次到一个物品是要么Allice全卖完,要么留给Bob必败(即a[i+1]-1)的钱,取两者最小值,然后和Allice的初始值比较即可。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"algorithm"
#include"iostream"
using namespace std;
#define INF 1000010
int dp[1000005],c[1000005],s[1000005];
int main()
{
int i,j,n,m,k,p,a,b;
while(scanf("%d%d%d",&n,&a,&b)!=EOF){
s[0]=0;
p=-1;
k=a+b;
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
{
scanf("%d",&c[i]);
}
for(i=1;i<=n;i++){
s[i]=s[i-1]+c[i];
if(s[i]>k){
p=i-1;
break;
}
}
if(p==-1)
p=n;
dp[p]=c[p];
for(i=p-1;i>=1;i--){
dp[i]=min(dp[i+1]+c[i],k-s[i-1]-dp[i+1]+1);
}
if(dp[1]>a){
printf("BOB\n");
}
else{
printf("ALICE\n");
}
}
}