HRBUST 2078:糖果(模拟,贪心)
题不难,但作为一道恶心到了我的题,我还是记录一下的好。
题意:n个人围一圈,要求:相邻两人,分数高的要比分数低的得到更多的糖果,若分数相同则必须得到相同数量的糖果。问满足要求的最少需要分配的糖果数。(N<10^6)
思路:
从最分数最小的人开始分配(当然要很小气的只给1个啦),然后慢慢分,在满足要求的情况下给最小。
实现起来细节稍微有点多。具体实现思路如下:
1:压缩。把相同分数且相邻的多人压缩成一人
2:用一个备份,sort,得到分数从小往大的顺序。
3:按上面的顺序缩糖果。4种情况:[左》中》右]--右+1; [左《中〈右]--左+1; [左《中》右]--max(左,右)+1; [左》中《右]--1
OVER
收获:慢慢理,实现不是问题,相信自己的实现实力。。。。嗯嗯嗯
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1000010 struct AA{
int id;
int v;
int num;
}a[N], stk[N]; bool cmpV(const AA &a, const AA &b) {
return a.v < b.v;
} int main(){
int n;
while (scanf("%d", &n) != EOF) {
for (int i = ; i < n; i++) {
scanf("%d", &a[i].v);
a[i].num = ;
}
int top = ;
stk[top++] = a[];
for (int i = ; i < n; i++) {
if (stk[top-].v == a[i].v) stk[top-].num++;
else stk[top++] = a[i];
}
if (top> && stk[top-].v == stk[].v) {
stk[].num += stk[top-].num;
top--;
}
for (int i = ; i < top; i++) {
stk[i].id = i;
a[i] = stk[i];
}
sort(stk, stk+top, cmpV);
for (int i = ; i < top; i++) {
int id2 = stk[i].id;
int id1 = (id2-+top)%top;
int id3 = (id2+)%top;
if (a[id1].v > a[id2].v && a[id2].v > a[id3].v) {
a[id2].v = a[id3].v+;
} else if (a[id1].v < a[id2].v && a[id2].v < a[id3].v) {
a[id2].v = a[id1].v+;
} else if (a[id1].v < a[id2].v && a[id2].v > a[id3].v) {
a[id2].v = max(a[id1].v,a[id3].v)+;
} else if (a[id1].v > a[id2].v && a[id2].v < a[id3].v) {
a[id2].v = ;
}
} long long ans = ;
for (int i = ; i < top; i++) {
ans += a[i].v*1ll*a[i].num;
}
printf("%lld\n", ans);
}
return ;
}
HRBUST 2078:糖果(模拟,贪心)的更多相关文章
- 2018.11.07 NOIP模拟 分糖果(贪心)
传送门 考虑 n = 2 时的情况:假定两个人分别为(a, b),(c, d),则当且仅当min(a,d) ≤ min(b,c)时,把(a, b)放在前面更优,否则把(c, d)放在前面更优 然后把n ...
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 3785 Solved: 1747[Submit][Statu ...
- Codeforces Round #375 (Div. 2) A B C 水 模拟 贪心
A. The New Year: Meeting Friends time limit per test 1 second memory limit per test 256 megabytes in ...
- Codeforces 452D [模拟][贪心]
题意: 给你k件衣服处理,告诉你洗衣机烘干机折叠机的数量,和它们处理一件衣服的时间,要求一件衣服在洗完之后必须立刻烘干,烘干之后必须立刻折叠,问所需的最小时间. 思路: 1.按照时间模拟 2.若洗完的 ...
- HDU 1034(传递糖果 模拟)
题意是一群孩子围成一个圈,每个人把手中的糖果分一半给右边的人,若分过之后手中的糖果数是奇数,则由老师提供一颗糖果给他,问这样传递多少圈所有人的糖果数都能相等,最终每人手里的糖果数是多少. 由于题中已经 ...
- 【BZOJ1045】[HAOI2008] 糖果传递 贪心
[BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正 ...
- bzoj 2457 [BeiJing2011]双端队列 模拟+贪心
[BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 457 Solved: 203[Submit][Status][D ...
- bzoj 3671: [Noi2014]随机数生成器【模拟+贪心】
降智好题 前面随机部分按照题意模拟,然后字典序贪心,也就是记录每个值的位置从1~nm依次看能不能取,能取的话更新行的取值范围(它上面的行一定取的列小于等于这个数取的列,下面行大于等于) #includ ...
- ZOJ 3829 模拟贪心
2014牡丹江现场赛水题 给出波兰式,推断其是否合法.假设不合法有两种操作: 1:任何位置加一个数字或者操作符 2:随意两个位置的元素对调 贪心模拟就可以 先推断数字数是否大于操作符数,若不大于 an ...
随机推荐
- 一个form表单对应多个submit
一个form表单多个submit 在平时项目开发过程中,经常会遇到一个form表单对应多个submit提交的情况,那么 ,这种情况应该怎么解决呢,也很简单,这时候就不能用submit来提交了,可以通过 ...
- CUB reduce errorinvalid configuration argument
解决CUB reduce errorinvalid configuration argument问题 在写TensorFlow代码时遇到报错 CUB reduce errorinvalid confi ...
- Altium Designer入门学习笔记4:PCB设计中各层的含义
阻焊层:solder mask,是指板子上要上绿油的部分:因为它是负片输出,所以实际上有solder mask的部分实际效果并不上绿油,而是镀锡,呈银白色! 助焊层:paste mask,是机器贴片时 ...
- 中国电信物联网平台入门学习笔记7:NB-IOT信号如何检测
NB-IOT设备会因为信号的原因,数据发不出.但数据发不出的原因有很多,这么排除是NB-IOT信号的问题呢?那就需要NB-IOT信号检测装置. 网上的信号检测设备 作为一个常年蜗居在实验室的穷屌丝而言 ...
- poj 1862 2*根号(n1*n2)问题 贪心算法
题意: 有n个数,要把其中2个数进行2*根号(n1*n2)操作,求剩下最小的那个数是多少? 哭诉:看题目根本没看出来要让我做这个操作. 思路: 每次把最大的,次大的拿出来进行操作 用"优先队 ...
- debian 7 安装vagrant
下载 vagrant_1.4.3_x86_64.deb: $ wget http://966b.http.dal05.cdn.softlayer.net/data-production/2f0b88e ...
- 【转】MySQL innodb_autoinc_lock_mode 详解 ,并发插入时主键冲突的解决方案
本文转载于 http://www.cnblogs.com/JiangLe/p/6362770.html innodb_autoinc_lock_mode这个参数控制着在向有auto_increment ...
- Service 回顾
绑定本地service需要实现onBind()方法
- 【POJ 2585】Window Pains 拓扑排序
Description . . . and so on . . . Unfortunately, Boudreaux's computer is very unreliable and crashes ...
- 聊聊、Nginx 初始化错误信息
这篇文章我们继续学习 main 方法,我们先来看看 ngx_debug_init() 这个方法. 从方法名我们也知道,debug初始化.我们先看看方法位置在哪.我们来断点在这个方法上面. Functi ...