
分析:
好吧,校赛时候唯二做出来的题之二,其实最开始没有读懂,第一次参加ACM赛制的比赛可能有点紧张,跟不上队友的趟,比赛时队友看了几眼就提出这是map,并且最后我们的确是用mapAC的,不过我真从来没用过map……可能是python里的映射上学期给我搞得有点心理阴影了,所以他一说map我就有点慌,最后也没认真去看队友的代码。
我最开始竟然傻到认真考虑整个变换的过程,然后觉得很懵,然后队内交流了一下,队友提出怎么才能保证次数最少?我突然想到了每次都把其中一个重复的数和最大的数相加,这样每次都会得到最新的最大数,也不需要完整的过程,分析出来次数就是重复数的个数-1,思考后面的题时候我意识到这道可以用set做,刚刚的确试了一下,set的确可以AC,代码写出来也挺简单,自认比队友的写法简洁一点。
AC代码:
赛内map版:
#include<bits/stdc++.h>
#include<map>
using namespace std;
int arr[100005],n,t,ans;
int main()
{
cin >> t;
while(t--){
ans=0;map<int,int> mp;
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%d",&arr[i]);
mp[arr[i]]++;
}
map<int,int>:: iterator it1;
for(it1=mp.begin();it1!=mp.end();it1++){
if(it1->second>1){
ans+=(it1->second-1);
}
}
cout << ans << endl;
}
}
个人set版:
#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
int t, n, temp;
set<int>s;
int main(){
cin>>t;
while(t--){
s.clear();
cin>>n;
for(int i = 0; i < n; i++){
cin>>temp;
s.insert(temp);
}
cout<<n-s.size()<<endl;
}
return 0;
}