CoderForce 140C-New Year Snowmen(贪心)

题目大意:有n个已知半径的雪球。堆一个雪人需要三个尺寸不同的雪球,问用这些雪球最多能堆多少个雪人?

题目分析:先统计一下每种尺寸的球的个数,从三种最多的种类中各取出一个堆成雪人,这样贪心能保证的到的数目最多。

代码如下:

# include<iostream>
# include<map>
# include<vector>
# include<cstdio>
# include<queue>
# include<algorithm>
using namespace std;

struct Node
{
    int val,cnt;
    Node(int _val,int _cnt):val(_val),cnt(_cnt){}
    bool operator < (const Node &a) const{
        return cnt<a.cnt;
    }
};
int ans[40005][3],n;
map<int,int>mp;
priority_queue<Node>q;

void solve()
{
    int cnt=0;
    while(!q.empty()){
        Node a=q.top();
        q.pop();
        if(q.empty()) break;
        Node b=q.top();
        q.pop();
        if(q.empty()) break;
        Node c=q.top();
        q.pop();
        ans[cnt][0]=a.val;
        ans[cnt][1]=b.val;
        ans[cnt][2]=c.val;
        ++cnt;
        if(a.cnt-1>0) q.push(Node(a.val,a.cnt-1));
        if(b.cnt-1>0) q.push(Node(b.val,b.cnt-1));
        if(c.cnt-1>0) q.push(Node(c.val,c.cnt-1));
    }
    printf("%d\n",cnt);
    for(int i=0;i<cnt;++i){
        sort(ans[i],ans[i]+3);
        printf("%d %d %d\n",ans[i][2],ans[i][1],ans[i][0]);
    }
}

int main()
{
    int a;
    while(~scanf("%d",&n))
    {
        mp.clear();
        for(int i=0;i<n;++i){
            scanf("%d",&a);
            ++mp[a];
        }
        map<int,int>::iterator it;
        while(!q.empty()) q.pop();
        for(it=mp.begin();it!=mp.end();++it){
            q.push(Node(it->first,it->second));
        }
        solve();
    }
    return 0;
}

  

时间: 2024-12-17 10:51:07

CoderForce 140C-New Year Snowmen(贪心)的相关文章

CodeForces 140C - New Year Snowmen(数据结构)

题目链接:click here~~ [题目大意]给你一个整数序列,求最多选出每个长度为3的且序列元素单调的子序列的个数,并且输出每个子序列的元素,作为一个子序列,每个元素只能选一次,也就是满足一次性,但每个子序列里可以存在相同的元素, [解题思路]刚开始以为比较简单,就顺着思路写了一遍,第一发W了之后发现此题还是有一定的思维性,之后一直纠结在最多能选出多少子序列,因为考虑到如果序列里相同的元素的个数对最后结果会产生不同的影响,于是就想到了set容器的自动去重. 思想: 1,在判断set.size

CodeForces 140C New Year Snowmen(堆)

题面 CodeForces 题解 因为要保证两两不同,所以不能单纯的开堆来维护,堆维护一个二元组,个数为第一关键字,编号为第二关键字,对于一个相同的颜色,统计一下这个颜色的个数再用堆来维护就好了. #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using std::min; using std::max; using std::sort; using st

New Year Snowmen CodeForces - 140C

As meticulous Gerald sets the table and caring Alexander sends the postcards, Sergey makes snowmen. Each showman should consist of three snowballs: a big one, a medium one and a small one. Sergey's twins help him: they've already made n snowballs wit

「CSPS 2019 十一」 贪心

一般来说,如果题目需要求一个最优解或者最小(大)花费之类的,而且除了暴力之外想不到什么好方法,那么就可能需要用贪心. 通常地,我们猜想一些步骤能不能直接使用贪心,然后再去证明这个贪心是对的. 有时候可能要多想几种贪心才能找到正确的那一种. New Year Snowmen Description 要堆起一个雪人,需要三个不同大小的雪球.现在有 \(n\) 个给定大小的雪球,问最多能堆起多少个雪人,并输出方案. Solution 每次用数量最多的三个雪球是最优的.可以用一个单调队列,每次取出最大的

【uva 1615】Highway(算法效率--贪心 区间选点问题)

题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到一个个区间,这样就是选最小的点覆盖所有的区间的问题了.我之前的一篇博文有较详细的解释:关于贪心算法的经典问题(算法效率 or 动态规划).代码实现我先空着.挖坑~

【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家

[题目大意] 有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度.每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值.每种牧草只会被一头牛选择.问最少要多少钱? [思路] 显然的贪心,把奶牛和牧草都按照鲜嫩度由大到小排序,对于每奶牛把鲜嫩度大于它的都扔进treap,然后找出后继. 不过注意后继的概念是大于它且最小的,然而我们这里是可以等于的,所以应该是找cow[i].fresh-1的后继,注意一下…… 1 #include<iostream> 2 #include<cstdio&

POJ1017 Packets(贪心算法训练)

Time Limit: 1000MS          Memory Limit: 10000K          Total Submissions: 51306          Accepted: 17391 Description A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These pro

ZOJ 3946 Highway Project 贪心+最短路

题目链接: http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3946 题解: 用dijkstra跑单元最短路径,如果对于顶点v,存在一系列边(ui,v)使得dis[v]最小(dis[v]表示0到v的距离).这些边能且只能选一条,那么我们自然应该选cost最小的那个边了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #inc

计蒜客 跳跃游戏(贪心)

给定一个非负整数数组,假定你的初始位置为数组第一个下标.数组中的每个元素代表你在那个位置能够跳跃的最大长度. 请确认你是否能够跳跃到数组的最后一个下标. 例如: A = [2,3,1,1,4], return ture A = [3,2,1,0,4], return false. 格式: 第一行输入一个正整数n,接下来的一行,输入数组A[n].如果能跳到最后一个下标,输出"true",否则输出"false" 样例1 ????输入:???? ????????5 ???