强迫症

强迫症

题意:链接:https://ac.nowcoder.com/acm/problem/16301
来源:牛客网

铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这样的操作,他可以选择序列里的任意两个元素相加,不妨记作ai和aj,然后把ai+aj放进序列里,再删掉ai和aj其中的随便一个,问最少操作多少次可以完成铁子的愿望?

示例1:

输入:

3

1 2 2

输出:

1

说明:

将序列的第1个整数和序列的第2个整数相加,再删掉第2个整数。

 

思路:每次可以选择两个元素相加放进数组并且删除其中一个,发现每次操作只能清除两个重复元素

找规律:1 2 2 2 有三个2,需要进行2次;

    1 2 2 3 3  需要进行2次;

    1 2 2 3 3 4 4 需要 3次;

    规律就是 所有重复元素的和-重复元素的个数;

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    ll n;
    cin>>n;
    map<ll,ll> mp;
    for(int i=0;i<n;i++)
    {
        ll t;
        cin>>t;
        mp[t]++;
    }
    ll ans = 0;
    int k=0;
    for(auto it = mp.begin();it!=mp.end();it++)
    {
        if(it->second>1)
        {
            ans+=it->second;
            k++;
        }
    }
    cout<<ans-k<<endl;
    return 0;
}

 

posted @ 2020-03-05 22:50  精神小伙儿  阅读(180)  评论(0编辑  收藏  举报