CF140C


贪心+优先队列


贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成

雪球数用优先队列维护


#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],b[N],nm;
struct ball{
int i,n; //i是离散数组中的编号,n为该种雪球的剩余数量
inline bool operator < (const ball &nt) const{
if(n==nt.n) return i<nt.i;
return n<nt.n;
}
};
struct ANS{
int x,y,z;
inline void change(){
int tx=x,ty=y,tz=z;
x=max(max(tx,ty),tz); //求最大
z=min(min(tx,ty),tz); //求最小
y=tx+ty+tz-x-z; //和减去最大最小就是中间值
}
}ans[N/3];
priority_queue<ball> q;
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
sort(a+1,a+1+n);
int un=unique(b+1,b+1+n)-b-1; //离散化
for(int i=1;i<=n;){
int j=i;
while(j+1<=n&&a[j+1]==a[i]) j++; //找到该种雪球最右到哪
int hn=j-i+1,id=lower_bound(b+1,b+1+un,a[i])-b; //该种雪球数量
q.push((ball){id,hn});
i=j+1; //跳过这一串相同的雪球
}
while(q.size()>=3){ //如果还有三种以上雪球
ball alpha=q.top();q.pop(); //最多的
ball beta=q.top();q.pop(); //次多的
ball gamma=q.top();q.pop(); //第三多的
alpha.n--;if(alpha.n) q.push(alpha); //都减去一个雪球
beta.n--;if(beta.n) q.push(beta);
gamma.n--;if(gamma.n) q.push(gamma);
ans[++nm]=((ANS){b[alpha.i],b[beta.i],b[gamma.i]}); //合成答案
}
printf("%d\n",nm);
for(int i=1;i<=nm;i++){
ANS now=ans[i];
now.change(); //整理一下答案的排序
printf("%d %d %d\n",now.x,now.y,now.z);
}
}

CF140C New Year Snowmen(贪心+优先队列)的更多相关文章

  1. hihoCoder 1309:任务分配 贪心 优先队列

    #1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN,  ...

  2. UVA 11134 - Fabled Rooks(贪心+优先队列)

    We would like to place  n  rooks, 1 ≤  n  ≤ 5000, on a  n×n  board subject to the following restrict ...

  3. C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列

    C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  4. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  5. 贪心+优先队列 HDOJ 5360 Hiking

    题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...

  6. [POJ1456]Supermarket(贪心 + 优先队列 || 并查集)

    传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 #include <queue> #include <cstdio> #include <i ...

  7. Painting The Fence(贪心+优先队列)

    Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...

  8. BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 3785  Solved: 1747[Submit][Statu ...

  9. 51nod 1163 最高的奖励(贪心+优先队列)

    题目链接:51nod 1163 最高的奖励 看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥. 按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的 ...

随机推荐

  1. Socket 对象(内建)方法

    函数 描述 服务器端套接字 s.bind() 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址. s.listen() 开始TCP监听.back ...

  2. POJ 3723 征兵问题(最小生成树算法的应用)

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15923   Accepted: 5510 Des ...

  3. Acwing:137. 雪花雪花雪花(Hash表)

    有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,…,ai,6ai,1,ai,2,…,ai,6. 因为雪花的形状是封闭的环形,所以 ...

  4. 验证TXT解析的正确性

    需要用到TXT解析,不同于CNAME和A解析,可以用PING命令验证,要验证TXT解析需要用到如下命令 nslookup -q=TXT txtdemo.lei.cool 8.8.8.8 输出内容如下 ...

  5. 【转】unity3d优化总结篇

    https://blog.csdn.net/weixin_33733810/article/details/94610167 某些技术或建议有些过时,但也值得参考 另外,关于如何设置不同layer的裁 ...

  6. App架构设计:接口的设计

    安全机制的设计 现在,大部分App的接口都采用RESTful架构,RESTFul最重要的一个设计原则就是,客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验 ...

  7. 使用 apt-get 清理

    大多数使用基于 Debian 的系统的人通常会使用 apt-get 来安装软件包和升级,但是我们多久才清理一次?让我们看下该工具本身的一些清理选项. 在基于 Debian 的系统上运行 apt-get ...

  8. Gradle 依赖

    在开发中,我们经常使用compile,api,implementation引入库,这三种是有区别的. 1 api和compile api和compile关键字作用效果是一样的,使用时可以互相替换. 实 ...

  9. 远程连接mysql要点 虚拟主机定义与分类

    远程连接mysql:通过主机地址与端口号连接 1. 主机地址:找到主机电脑 2. 端口号:找到对应mysql软件 mysql客户端访问服务端需要进行寻找匹配:连接认证-h 主机地址 例如 -hloca ...

  10. golang入门案例之http client请求

    发请求,接收接送,并解析 package main import ( "fmt" "net/http" "io/ioutil" " ...