一道很好的 map 题
注:本题不只一种解法,我只是认为这样简单一些
你有n 个数,若每次操作是将其中的 n-1 个数以这 n-1 个数的平均数替换(不一定是整数),那么请你判断这 n 个数能否在有限次操作内全部相等?
本题的思路是先将每个数据求和保存在一个数组里,求出平均值,再检查有没有一个数与这个平均值相等,如果相等,输出 YES ,否则 NO。
//Everything Everywhere All But One
#define debug
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 5e1 + 1;
int t, n, x;
double cnt; //cnt用来统计x的总和,cnt必须要用double
int main(){
cin.tie(0); //优化
cout.tie(0); //优化
cin >> t;
while(t--){
cin >> n;
map<double, int> a; //定义map,注意必须要用double 和 int 的类型,因为下面cnt / n可能为小数
for(int i = 1; i <= n; i++){
cin >> x;
a[x]++;
cnt += x;
}
if(a[cnt / n]){ //如果有中间的数,就说明可以用操作实现将所有数变成同一个数
cout << "YES\n";
}
else{
cout << "NO\n";
}
cnt = 0; //记住清零
}
return 0; //完美
}
为什么可以这样做?
因为我们可以推导一下,在 n 个数中只修改 n - 1 个,肯定是优先修改两边的数,而尽量保留中间的数,这样才能更好的使数字都相等。
为什么不能用桶?
在求平均值的时候,可能会出现分数,由于桶的下标只能是 int ,而 map 又可以完美地权衡这一点,所以选择 map。
为什么 map 可以完美的权衡桶不能使用 double 的下标?
map 他是一个很神奇的东西,它可以将 double 甚至 string 来代表下标,初学者只需要懂得这个原理就可以了。