CF1686A Everything Everywhere All But One题解

 一道很好的 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 来代表下标,初学者只需要懂得这个原理就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值