列表

详情


NC50776. 毕业生的纪念礼物

描述

现在有n个纪念品,每个纪念品都有一个种类r[i],现在要求对每个毕业生分发三个种类不同的纪念品,现在需要你来计算下共可以发给多少个毕业生?

输入描述

第一行一个整数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;
}

上一题