强迫症
题意:链接: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; }