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 ...
随机推荐
- python数据类型之列表(list)和其常用方法
列表是python常用数据类型之一,是可变的,可由n = []创建,也可由n = list()创建,第一种方法更常用. 常用方法总结: # 创建方法 n = [] 或者 n = list() # in ...
- STM32F407VET6之IAR之ewarm7.80.4工程建立(基于官方固件库1.6版本) 的工程文件目录
最后整理结构如下所示,├─cmsis│ startup_stm32f401xx.s│ startup_stm32f40xx.s│ startup_stm32f40_41xxx.s│ startup_s ...
- win7下设置git客户端
msysgit官网: http://msysgit.github.io/ 下载msysgit http://msysgit.googlecode.com/files/Git-1.8.5.2-previ ...
- ssh登陆之忽略known_hosts文件
在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- Linux网络编程:客户端/服务器的简单实现
一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...
- 【MySQL】MySQL备份和恢复
一.为什么要备份数据 在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失, 大概分为以下几种. 硬件故障 软件故障 自然灾害 黑客攻击 误操作 (占比最大) 所以, 为了在数据丢失之后能够 ...
- 配置LAMP环境
对我这种Linux小菜鸡来说,集成环境是最好的选择. 一,下载wget --no-check-certificate https://github.com/teddysun/lamp-yum/arch ...
- luogu3386 【模板】二分图匹配 匈牙利算法 hdu2063 过山车 dinic
luogu 匈牙利算法 #include <iostream> #include <cstring> #include <cstdio> using namespa ...
- (转)React 入门实例教程
作者: 阮一峰 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React ...
- socket编程了解
Socket 编程 Socket通讯原理描述: 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连 ...