题目链接:Game with Pearls
解题思路:简单题,多种情况考虑。
如果给出的序列和sum大于(n + 1) * n / 2的话就是Tom赢
如果给出的序列和sum小于(n + 1) * n / 2,并且(sum - (n + 1) * n / 2) % k != 0也是Tom赢
剩下的就是从大到小搜索,可行的解,这里注意原序列要从小到达排序。因为a < b所以并且a + nk == b + mk,那么a可以去构成更多的数,就是<=B的所以要优先用比较大的数字。
#include<cstdio>
#include<algorithm>
#define MAX 110
using namespace std;
int num[MAX];
bool v[MAX];
int n, m, k;
int t_sum, sum;
bool find(int x){
int i, j;
for(i = n - 1; i >= 0; i--){
if(!v[i] && x >= num[i] && (x - num[i]) % k == 0){
v[i] = true;
return true;
}
}
return false;
}
int main(){
int i, j;
scanf("%d", &m);
while(m--){
scanf("%d%d", &n, &k);
memset(v, false, sizeof(v));
t_sum = n * (n + 1) / 2;
sum = 0;
for(i = 0; i < n; i++){
scanf("%d", &num[i]);
sum += num[i];
}
if(sum > t_sum || (t_sum > sum && (t_sum - sum) % k != 0)){
puts("Tom");
continue;
}
sort(num, num + n);
bool flag = true;
for(i = n; i > 0; i--){
if(!find(i)){
flag = false;
break;
}
}
if(flag){
puts("Jerry");
}
else{
puts("Tom");
}
}
return 0;
}