最適戦略は「敵の最も大きいのを潰す」か「自分の大きい方2つを合併する」のどちらか。
ただし、敵の最も大きいのを潰せた時は、敵は自分の最も大きいのを潰せないので、最初の2手だけ調べればいい。(練習会では潰して潰して…とずっと繰り返せると思ってた。頭弱い)
#define REP(i,a,b) for(int i=a;i<b;i++) #define rep(i,n) REP(i,0,n) lint a[100010],b[100010],c[100010]; bool cal(){ lint x=a[0],y=b[0]; rep(i,100005){ x+=a[i+1];if(y>x) return false; y+=b[i+1];if(x>y) return true; } } int main() { int n,m; for(int i=1;cin>>n>>m;i++){ memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c)); rep(i,n) cin>>a[i];rep(i,m) cin>>b[i]; sort(a,a+n);reverse(a,a+n);sort(b,b+m);reverse(b,b+m); cout<<"Case "<<i<<": "; if(cal()){ cout<<"Takeover Incorporated"<<endl; } else{ if(a[0]<b[0]) cout<<"Buyout Limited"<<endl; else{ rep(i,m-1) c[i]=b[i+1]; memcpy(b,a,sizeof(a));memcpy(a,c,sizeof(c)); if(cal()) cout<<"Buyout Limited"<<endl; else cout<<"Takeover Incorporated"<<endl; } } } }