CF140C New Year Snowmen(贪心+优先队列)
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(贪心+优先队列)的更多相关文章
- hihoCoder 1309:任务分配 贪心 优先队列
#1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, ...
- UVA 11134 - Fabled Rooks(贪心+优先队列)
We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the following restrict ...
- 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 ...
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
- 贪心+优先队列 HDOJ 5360 Hiking
题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...
- [POJ1456]Supermarket(贪心 + 优先队列 || 并查集)
传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 #include <queue> #include <cstdio> #include <i ...
- Painting The Fence(贪心+优先队列)
Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 3785 Solved: 1747[Submit][Statu ...
- 51nod 1163 最高的奖励(贪心+优先队列)
题目链接:51nod 1163 最高的奖励 看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥. 按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的 ...
随机推荐
- [洛谷P1712] NOI2016 区间
问题描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...
- socket 异步 发送 接收 数据
Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); / ...
- bytes和bytearray总结
The core built-in types for manipulating binary data are bytes and bytearray. They are supported by ...
- [转载]blktrace分析IO
前言 上篇博客介绍了iostat的一些输出,这篇介绍blktrace这个神器.上一节介绍iostat的时候,我们心心念念希望得到块设备处理io的service time,而不是service time ...
- 第六周总结 & 实验报告(四)
第六周小结 一.instanceof关键字 在Java中使用instanceof关键字判断一个对象到底是哪个类的实例,返回boolean类型 1.instanceof关键字的作用 例c ...
- EBS 清除高速缓存
以R12.1.3为例: 以 “功能管理员 ”职责打开OAF界面 然后依次点击“核心服务”->“高速缓存结构”->“全局配置”->“清除所有高速缓存”->“是”,即可
- leetcode 75颜色分类
两趟扫描,由于排序变量的特殊性,使用计数排序方法可以明显降低至O(n)time O(n) space 关于计数排序:https://mp.weixin.qq.com/s/WGqndkwLlzyVOHO ...
- android中常用的注解说明
1.@Nullable 作用于函数参数或者返回值,标记参数或者返回值可以为空. 2,@NonMull 作用于函数参数或者返回值,标记参数或者返回值不可以为空. 3.@LayoutRes 标记整数值a ...
- 使用ViewPager实现广告自动轮播的效果
package com.loaderman.viewpgerlunbodemo; import android.os.Bundle; import android.os.Handler; import ...
- TimePicker 时间选择器
用于选择或输入日期 固定时间点 提供几个固定的时间点供用户选择 使用 el-time-select 标签,分别通过star.end和step指定可选的起始时间.结束时间和步长 <el-time- ...