出处
第一届大沥镇科技节第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;
}
601

被折叠的 条评论
为什么被折叠?



