CF767E ChangeFree【贪心/优先队列】By cellur925
$naive$想法
最开始的一个贪心策略是每次尽量花掉硬币 ,如果不满足条件,就花纸币。而且不满足条件的时候,要尽量向百取整。(显然是不对的,因为有时候不够)但是显然这个贪心策略是错误的,因为花纸币的那一天可能恰好$Angry cashier$的愤怒值最高。那么我们怎么确认在哪天选择找钱?这是一个问题......
正解
首先我们知道,我们要把每天需要花的钱膜100来处理。我们不停地使用硬币,直到硬币数量变成负数,这告诉我们需要在这之前有一天换出了额外的硬币。
为了保证我们问题的贪心性,我们维护一个优先队列。队列里存的是每天$wi*(100-xi%100)$的值,也就是我们需要找钱的数量。
因为我们是到硬币数量为负数时才尽量去找之前要找钱的时刻,所以我们之前减的时候可以认为是无脑减的,而需要找钱的时候,我们恰好就使硬币数量增加100了。
Code
#include<cstdio>
#include<algorithm>
#include<queue> using namespace std;
typedef long long ll; int n,m;
ll ans;
int ned[],satis[],ex[];
struct cellur{
int id,w;
};
bool operator < (const cellur &x,const cellur &y)
{
return x.w>y.w;
}
priority_queue<cellur>q; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&ned[i]);
for(int i=;i<=n;i++)
scanf("%d",&satis[i]);
for(int i=;i<=n;i++)
{
int tmp=ned[i];
tmp%=;
if(!tmp) continue;
cellur x;
x.id=i;
x.w=satis[i]*(-tmp);
q.push(x);
m-=tmp;
if(m<)
{
m+=;
cellur u=q.top();q.pop();
ans+=u.w;
ex[u.id]++;
}
}
printf("%lld\n",ans);
for(int i=;i<=n;i++)
{
printf("%d ",ned[i]/+ex[i]);
if(!ex[i]) printf("%d",ned[i]%);
else printf("");
printf("\n");
}
return ;
}
一道比较巧妙的贪心题目,感觉自己贪心这部分还很薄弱,也要补一补了...
CF767E ChangeFree【贪心/优先队列】By cellur925的更多相关文章
- 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". 解题思 ...
- CF140C New Year Snowmen(贪心+优先队列)
CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 3785 Solved: 1747[Submit][Statu ...
随机推荐
- BZOJ 3363 POJ 1985 Cow Marathon 树的直径
题目大意:给出一棵树.求两点间的最长距离. 思路:裸地树的直径.两次BFS,第一次随便找一个点宽搜.然后用上次宽搜时最远的点在宽搜.得到的最长距离就是树的直径. CODE: #include < ...
- Sublime Text使用
安装Sublime Text Sublime 的安装比較简单,我们能够直接去官网http://www.sublimetext.com/,点击Download菜单.进入之后选择自己操作系统的进行下载安装 ...
- SQL Server故障转移集群
在XenServer集群上给客户搭建一个应用服务,要求有负载均衡,Web服务器用Windows Server 2008 R2 + IIS,数据库Sql Server 2008 R2,并且使用SAN存储 ...
- this、call和apply、bind
this关键字: JavaScript的this关键字,总是指向一个对象,具体指向哪个对象,是根据运行时函数指向环境动态绑定的.简单来说,this就是谁调用指向谁.具体使用中,this的指向,大致可以 ...
- const *char p和char const *p
const *char p和char const *p,const char*p的区别 char*const p——p必须初始化,且不能指向别处,即p是指针常量: char const*p——p指向的 ...
- 第一讲:使用html5——canvas绘制奥运五环
<html> <head> <title>初识canvas</title> </head> <body> <canvas ...
- POJ 1737 Connected Graph(高精度+DP递推)
题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ...
- 20170225 ABAP获取字符串长度/字节长度
函数YGET_CHAR_LONG: FUNCTION YGET_CHAR_LONG. *"-------------------------------------------------- ...
- dotnet core 入门
之前一至用的dotnet 做开发,项目没有用过.netcore,现在看微软对dotnetcore的重视度越来越高,所以dotnetcore也是每一个.dotnet开发人员的一项必备技能.一个偶然的机会 ...
- ios常用到的第三方库
在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使我们的开发变得更有效率:同时,也可以从它们的源代码中学习到很多有用的东西. Reachability 检测网络连接 用来检查网 ...