链接:https://codeforces.com/problemset/problem/1472/D
题目
During their New Year holidays, Alice and Bob play the following game using an array a of n integers:
If there are no numbers left in the array, then the game ends. The player with the highest score wins. If the scores of the players are equal, then a draw is declared.
For example, if n=4 and a=[5,2,7,3], then the game could go as follows (there are other options):
You want to find out who will win if both players play optimally. Note that there may be duplicate numbers in the array.
题意
Alice和Bob做游戏,游戏内容是这样的:
如果双方都是1000%的状态对待游戏,那么问谁能够获胜?
(输出胜者的名字,如果平局就输出“Tie”)
思路
11点半之后疼的实在是不行了,有点坐不住,再加上我本来就不够聪明,这个div3打的很烂。
一开始以为是博弈论(我是fw),后来发现很简单。
将数据分成奇数列和偶数列并排序。
Alice每次拿的时候只需要看最大的偶数如果比奇数小,那就拿对方的奇数,否则拿自己的偶数;
Bob每次拿的时候只需要看最大的奇数如果比偶数小,那就拿对方的偶数,否则拿自己的奇数。
(走对方的路,让对方无路可走)
看代码,伊丽莎白!
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f
using namespace std;
const int maxn=2e5+100;
typedef long long ll;
ll even[maxn],odd[maxn];
int main()
{
ll T;
cin>>T;
while(T--)
{
ll k=0,l=0;
ll n,x;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
if(x%2==0)
even[k++]=x;
else
odd[l++]=x;
}
sort(even,even+k);
sort(odd,odd+l);
ll s1=0,s2=0;
ll f=1;
k--,l--;
// printf("%lld:s1=%lld s2=%lld k=%lld l=%lld\n",f,s1,s2,k,l);
while(k>=0||l>=0)
{
if(f%2)
{
if(k<0)
l--;
else
{
if(l<0||odd[l]<even[k]) //还有一种情况就是对方没有数字了,就安心拿自己的数字
{
s1+=even[k];
k--;
}
else
l--;
}
}
else
{
if(l<0)
k--;
else
{
if(k<0||odd[l]>even[k])
{
s2+=odd[l];
l--;
}
else
k--;
}
}
// printf("%lld:s1=%lld s2=%lld k=%lld l=%lld\n",f,s1,s2,k,l);
f++;
}
if(s1==s2)
cout<<"Tie"<<endl;
else if(s1<s2)
cout<<"Bob"<<endl;
else
cout<<"Alice"<<endl;
}
}
奉劝各位注意身体,否则后果堪忧!
哪个小朋友再不注意身体,就抓到灭亡迅雷站,消除u咩!