为了保证游戏的公平性,牛牛规定,只有当每位玩家手中的两张卡牌战斗力之和相同时,才能认为这个对局是公平的。
但是牛牛发现,如果让玩家自行选择卡牌,总是会出现战斗力一边倒的局面,所以,他想请你写一个程序,由系统来完成随机分配卡牌的任务。
那么,在已知
本题为多组测试数据,第一行输入一个正整数,代表测试数据组数。
对于每组测试数据,第一行输入一个正整数,代表卡牌数量。
第二行输入个正整数
,依次代表每张卡牌的战斗力。
对于每组测试数据,一行输出一个整数代表最多可以有多少位玩家参与战斗。特殊的,由于一场对局至少需要两名玩家,所以,若在保证对局公平的基础上,不能支持至少两名玩家参与对局,那么,只需要输出代表该对局作废。
2 3 3 6 9 4 2 3 5 6
-1 2
第一个测试数据中,只有三张卡牌,由于一个玩家就需要手持两张卡牌,所以无论如何都不能支持至少两名玩家进行游戏。
第二个测试数据中,第一张卡牌和第四张卡牌的战斗力之和等于第二张卡牌和第三张卡牌的战斗力之和,可以让最多两名玩家同时进行游戏。
#include<iostream> #include<cstring> using namespace std; const int N = 210; int f[N]; int t, n; int main() { cin >> t; while(t--) { memset(f, 0, sizeof f); cin >> n; for(int i=0;i<n;i++) { int x; cin >> x; f[x]++; } int ans = 0; for(int i=2;i<=200;i++) { int sum = 0; for(int j=1;j<=i/2;j++) { if(!f[j] || !f[i-j]) continue; if(j == i - j) sum += f[j] / 2; else sum += min(f[i-j], f[j]); } ans = max(sum, ans); } if(ans <= 1) cout << -1; else cout << ans; cout << endl; } }