强迫症【牛客tracker 每日一题】
2026/8/28 21:56:22 网站建设 项目流程

强迫症

时间限制:1 秒
空间限制:256 MB
知识点:枚举、贪心

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!


题目描述

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


输入描述

第一行一个整数n nn表示序列的长度( 1 ≤ n ≤ 10 5 ) (1 \le n \le 10^5)(1n105)

第二行n nn个整数a i a_iai表示序列的每个整数( 1 ≤ a i ≤ 10 9 ) (1 \le a_i \le 10^9)(1ai109)


输出描述

输出一行表示答案。


示例

示例 1

输入:

3 1 2 2

输出:

1

说明:
将序列的第1 11个整数和序列的第2 22个整数相加,再删掉第2 22个整数。

解题思路

本题是最少操作次数使序列元素两两不同的构造题。每次操作可以将任意两个元素相加,把和加入序列,并删除其中一个原元素,目标是让最终序列中没有重复元素。

1. 问题等价转化
2. 算法实现
  1. 使用哈希表unordered_map统计每个数字出现的次数。
  2. 遍历哈希表,对于出现次数c n t > 1 cnt > 1cnt>1的数字,将c n t − 1 cnt - 1cnt1累加到答案。
  3. 输出答案。
3. 复杂度分析

总结

问题的关键在于每次操作可以“消耗”一个重复元素并生成一个唯一的新元素,从而逐步消除重复。因此最少操作次数等于重复元素的总数,即n nn减去不同数字个数。利用哈希表统计频次即可快速求解。

代码简要说明

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);unordered_map<ll,ll>mp;ll n;cin>>n;for(ll i=0;i<n;i++){ll x;cin>>x;mp[x]++;}ll res=0;for(auto[key,cnt]:mp)if(cnt>1)res+=cnt-1;cout<<res<<'\n';return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询