Even-Odd Game Codeforces-1472D
2021.05.02 训练题G
题目大意: Alice和Bob玩取数字游戏,Alice取得偶数就加上对应的分值,取得奇数不得分,Bob取得奇数就加上对应的分数,取偶数不得分,Alice先手取数字,问最终谁的得分高,平局输出 " Tie "
**思路:**双栈或双数组,队列+贪心,将奇数排序放到一个数组中,偶数排序放到一个数组中,轮到谁,看奇数最大值和偶数最大值谁大取谁就可以了,注意奇数数组取完或者偶数数组取完的情况
题目:
During their New Year holidays, Alice and Bob play the following game using an array a of n integers:
Players take turns, Alice moves first.
Each turn a player chooses any element and removes it from the array.
If Alice chooses even value, then she adds it to her score. If the chosen value is odd, Alice's score does not change.
Similarly, if Bob chooses odd value, then he adds it to his score. If the chosen value is even, then Bob's score does not change.
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):
On the first move, Alice chooses 2 and get two points. Her score is now 2. The array a is now [5,7,3].
On the second move, Bob chooses 5 and get five points. His score is now 5. The array a is now [7,3].
On the third move, Alice chooses 7 and get no points. Her score is now 2. The array a is now [3].
On the last move, Bob chooses 3 and get three points. His score is now 8. The array a is empty now.
Since Bob has more points at the end of the game, he is the winner.
You want to find out who will win if both players play optimally. Note that there may be duplicate numbers in the array.
Input
The first line contains an integer t (1≤t≤104) — the number of test cases. Then t test cases follow.
The first line of each test case contains an integer n (1≤n≤2⋅105) — the number of elements in the array a.
The next line contains n integers a1,a2,…,an (1≤ai≤109) — the array a used to play the game.
It is guaranteed that the sum of n over all test cases does not exceed 2⋅105.
Output
For each test case, output on a separate line:
"Alice" if Alice wins with the optimal play;
"Bob" if Bob wins with the optimal play;
"Tie", if a tie is declared during the optimal play.
Example
Input
4
4
5 2 7 3
3
3 2 1
4
2 2 2 2
2
7 8
Output
Bob
Tie
Alice
Alice
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
long n,indexA=0,indexB=0;
scanf("%ld",&n);
long a[n],alice[n],bob[n];
int i;
for(i=0;i<n;i++) scanf("%ld",&a[i]);
sort(a,a+n);
for(i=0;i<n;i++){
if(a[i]%2==0) {
alice[indexA]=a[i];
indexA++;
}else{
bob[indexB]=a[i];
indexB++;
}
}
indexA--;
indexB--;
long long sumA=0,sumB=0;
for(i=0;i<n;i++){
if((i&1)==0){
if(indexA<0) indexB--;
else if(indexB<0) {
sumA+=alice[indexA];
indexA--;
}else{
if(alice[indexA]>=bob[indexB]) {
sumA+=alice[indexA];
indexA--;
}else indexB--;
}
}else{
if(indexB<0) indexA--;
else if(indexA<0) {
sumB+=bob[indexB];
indexB--;
}else{
if(bob[indexB]>=alice[indexA]) {
sumB+=bob[indexB];
indexB--;
}else indexA--;
}
}
}
if(sumA==sumB) printf("%s\n","Tie");
else if(sumA > sumB) printf("%s\n","Alice");
else printf("%s\n","Bob");
}
return 0;
}