题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3983
首先要知道的,如果要进行敌对交易,一定是把对方最大的干掉,否则是没有意义的
然后分为几种情况进行讨论:
- 己方只剩一个:能吃掉对方最大的就吃掉,否则就输
- 对方只剩一个:己方合并前两大
- 己方最大比对方最大小:己方合并前两大
- 上一条保证了目前己方最大一定比对方最大的大,如果己方前两大的和比对方前两大的和要小:吃掉对方最大,不然就会失去优势
- 否则:不论如何还会有优势,己方合并前两大
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include<bits/stdc++.h> #define ll long long using namespace std; inline ll rd(){ ll x=0,y=1;char c=getchar(); while(!isdigit(c)){if(c=='-')y=-y;c=getchar();} while(isdigit(c))x=x*10+c-'0',c=getchar(); return x*y; } ll n,m; priority_queue<ll>q[2]; inline ll tp(ll x){ ll a=q[x].top(); q[x].pop(); ll b=q[x].top(); q[x].push(a); return a+b; } inline void un(ll x){ ll a=q[x].top(); q[x].pop(); ll b=q[x].top(); q[x].pop(); q[x].push(a+b); } int main(){ ll T=1; while(~scanf("%lld%lld",&n,&m)){ printf("Case %lld: ",T++); while(!q[0].empty())q[0].pop(); while(!q[1].empty())q[1].pop(); for(ll i=1; i<=n; i++){ ll x=rd(); q[0].push(x); } for(ll i=1; i<=m; i++){ ll x=rd(); q[1].push(x); } ll now=0; while(!q[0].empty() && !q[1].empty()){ if(q[now].size()==1){ if(q[now].top()<q[now^1].top())q[now].pop(); else q[now^1].pop(); } else if(q[now^1].size()==1)un(now); else if(q[now].top()<q[now^1].top())un(now); else if(tp(now)<=tp(now^1))q[now^1].pop(); else un(now); now^=1; } if(q[1].empty())puts("Takeover Incorporated"); else puts("Buyout Limited"); } return 0; } |