水果沙拉

出处

第一届大沥镇科技节第D题

题目描述

叶师傅买来了一大堆水果,准备给徒弟们做水果沙拉。水果的种类有很多,有苹果、香蕉、西瓜、菠萝、葡萄……总而言之有k种水果,而且为了表达方便,我们用一个整数来代表水果的类别。

叶师傅规定:4份不同的水果能组合成一碗水果沙拉。

如果叶师傅买来的水果总共有n份,那么叶师傅最多能做多少碗水果沙拉?

输入格式

第一行是两个整数n, k,分别代表水果的份数和种类数。

第二行有n个整数 ai,每个整数代表一份水果的类别。

输出格式

输出一个整数,代表最多能做的水果沙拉碗数。

样例输入/输出

input1

10 5
1 2 3 4 2 3 4 5 1 1
output1
2

input2

12 6
1 1 1 1 3 5 6 6 2 3 1 6

output2

2

input3

22 6
4 2 5 1 1 5 6 6 1 1 6 5 6 1 4 3 5 6 4 6 2 6

output3

5

数据规模与提示

样例2能做的2份沙拉分别是1、3、5、6和1、6、2、3,每份水果用完就消耗掉了,不能重复利用。

40%数据:4≤k≤1e3

60%数据:4≤k≤1e6

100%数据:4≤k≤1e12;4≤n≤1e3;0≤ai≤k

本题思路如下:

        因为本题数据量比较大,不能直接下标计数,暴力枚举又很困难,所以要间接统计每种水果的个数,虽然k很大,但最多还是只有n种水果,所以可以利用一个循坏统计水果个数,再进行操作。

本题代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,k,a[1005],b[1005],x,y,l;
int main(){
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	sort(a,a+n);//将所有相同品种水果分在一起 
	for(int i=0;i<n;i++)
	{
		if(i!=0&&a[i]!=a[i-1])x++;//每出现一种水果就统计 
		b[x]++;
	}
	for(int i=x;i>=0;)//直接对水果个数进行操作 
	{
		sort(b,b+x);//先拿大的做拼盘 
		if(i-3<0||b[i-3]<=0)break;//如果做不了就退出循环 
		if(b[i]<=0)i--;//如果当前品种水果没有就用下一种 
		b[i]--;
		b[i-1]--;
		b[i-2]--;
		b[i-3]--;
		y++;
	}
	cout<<y;
	
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值