NC50776. 毕业生的纪念礼物
描述
输入描述
第一行一个整数n,1≤n≤100000,代表纪念品的个数;
第二行包含n个整数,分别是r[1], r[2], r[3]......r[n],1≤r[i]≤1e9,表示每个纪念品所属的种类。
输出描述
输出一个整数,代表最多能够分发给的毕业生人数。
示例1
输入:
14 1 1 2 2 3 3 4 4 4 4 5 5 5 5
输出:
4
示例2
输入:
7 1 2 3 4 5 6 7
输出:
2
C++14(g++5.4) 解法, 执行用时: 97ms, 内存消耗: 1252K, 提交时间: 2019-07-09 14:09:07
#include<bits/stdc++.h> using namespace std; bool cmp(int a,int b) { return a>b; } int main() { int n,r[100086]={0}; map<int,int> m;int tot=0; scanf("%d",&n);int t1; for(int i=0;i<n;i++){ scanf("%d",&t1); if(m[t1]==0) m[t1]=++tot; r[m[t1]]++; } sort(r+1,r+tot+1,cmp); if(tot<3){ printf("0"); return 0; } int sum=0; while(r[3]!=0){ sum++; r[1]--;r[2]--;r[3]--; sort(r+1,r+tot+1,cmp); } printf("%d",sum); }
C++(g++ 7.5.0) 解法, 执行用时: 48ms, 内存消耗: 1352K, 提交时间: 2023-04-24 13:09:28
#include<bits/stdc++.h> using namespace std; int r[100005],b[100005]; int main() { int n,i,j,ans=0,tep=0,sum=0; cin>>n; for(i=1;i<=n;i++) cin>>r[i]; sort(r+1,r+n+1); for(i=1;i<=n;i++) { if(r[i]!=tep) { ans++; tep=r[i]; } b[ans]++; } sort(b+1,b+1+ans); while(b[ans]>0&&b[ans-1]>0&&b[ans-2]>0) { b[ans]--; b[ans-1]--; b[ans-2]--; sum++; sort(b+1,b+ans+1); } cout<<sum<<endl; return 0;}
C++11(clang++ 3.9) 解法, 执行用时: 23ms, 内存消耗: 864K, 提交时间: 2019-07-08 16:30:01
#include<bits/stdc++.h> using namespace std; map<int,int>mp; int main(){ int n,x,y,ma=0,ma1=0,mi,mi1;scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&x),y=++mp[x]; if(y>ma){ if(x!=mi)ma1=ma,mi1=mi; ma=y,mi=x; } else if(y>ma1)ma1=y,mi1=x; } printf("%d",min(n/3,min((n-ma)/2,n-ma-ma1))); return 0; }