题解:AT_agc056_d [AGC056D] Subset Sum Game
LastKismet · · 题解
Sol
假如 Bob 先手,他的目的就是让 Alice 拿到的和尽可能小或者尽可能大。
假如尽可能小,先给序列升序排序,此时 Alice 至多拿到
假如奇数位和
现在就相当于是 Alice 先走一步然后开始 Bob 先手。这样的话假如序列符合条件那么显然第一步随便走然后遵循上述策略即可。
然而原序列不符合上述条件时,并不一定不行。
不妨先枚举 Alice 第一步选的
但假如不存在这么一个子序列就一定不符合条件吗?也就是说对于每个
所以这个条件是充要的。于是可以简单
Code
const int N=5005;
int n;
ll l,r,a[N],s1[N],s2[N];
inline void Main(){
cin>>n>>l>>r;
rep(i,1,n)cin>>a[i];sort(a+1,a+1+n);
s1[1]=a[1];
rep(i,2,n)s1[i]=s1[i-1],s2[i]=s2[i-1],(i&1?s1:s2)[i]+=a[i];
rep(i,1,n)repl(j,1,i)if(s1[j-1]+s2[i-1]-s2[j]+s1[n]-s1[i]>=l-a[i]&&s2[j-1]+s1[i-1]-s1[j]+s2[n]-s2[i]<=r-a[i])return put("Alice"),void();
rep(i,1,n)repl(j,1,i)if(s1[j-1]+s2[i-1]-s2[j]+s1[n]-s1[i]>=l-a[j]&&s2[j-1]+s1[i-1]-s1[j]+s2[n]-s2[i]<=r-a[j])return put("Alice"),void();
put("Bob");
}