题目大意
给一组数要求删去两个数字之后,平均数不变求有多少种选择方法。
基本思路
去除两个数之后平均数不变,要求整两个数加起来是平均数的两倍所以平均数要么是
x.5或者整数否者是零,然后开map记录每个数字出现的次数,枚举每个数与他之和
是平均数两倍的数出现的次数,加进答案里去,如果是本身要把自己减去,细节看
代码。
ac代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5 + 10;
int a[maxn];
map<int,int> ma;
int main(){
int t; scanf("%d",&t);
while(t --){
ll n; scanf("%lld",&n);
ma.clear();
ll num = 0;
for(int i = 1; i <= n; i ++){
scanf("%d",&a[i]);
num += a[i];
ma[a[i]] ++;
}
ll k = __gcd(num,n);
if(num % n == 0){
num = num / n * 2;
}else if(n / k == 2){
num = num / n * 2 + 1;
}else{
num = -1;
}
if(num == -1){
printf("0\n");
continue;
}
ll ans = 0;
for(int i = 1; i <= n; i ++){
int temp = num - a[i];
if(a[i] * 2 == num) ans --;
ans += ma[temp];
}
printf("%lld\n",ans / 2); // 算了两次除2
}
return 0;
}