uva1335 - Beijing Guards
2016-02-02 14:38
302 查看
题意:
n个人,每个人都想要礼物,相邻两个人会聊天炫耀礼物,不能让他们礼物相同,问至少要多少个礼物才能满足条件。
思路:
偶数个人的话,礼物个数即为最大的两个邻居想要礼物数之和。
奇数个人的话比较复杂,二分搜索最小礼物个数p,将礼物分为左右两堆,左堆放x,右堆y(x+y=p),left[i],right[i]分别表示第i个人拿走了左,右两堆多少个礼物,让奇数号的人尽量从右边拿,偶数号的人尽量从左边拿,第一个人拿走了左边所有的x,最后只要再判断一下最后一个人是否拿过左边的礼物就行。
代码:
n个人,每个人都想要礼物,相邻两个人会聊天炫耀礼物,不能让他们礼物相同,问至少要多少个礼物才能满足条件。
思路:
偶数个人的话,礼物个数即为最大的两个邻居想要礼物数之和。
奇数个人的话比较复杂,二分搜索最小礼物个数p,将礼物分为左右两堆,左堆放x,右堆y(x+y=p),left[i],right[i]分别表示第i个人拿走了左,右两堆多少个礼物,让奇数号的人尽量从右边拿,偶数号的人尽量从左边拿,第一个人拿走了左边所有的x,最后只要再判断一下最后一个人是否拿过左边的礼物就行。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100005; int n, r[N], Left[N], Right[N]; int Judge(int p) { //printf("p:%d",p); int i, x, y; Left[1] = r[1]; Right[1] = 0; x = r[1]; y = p - r[1]; for (i = 2; i <= n; i++) { //偶数尽量从左边拿 if (i % 2 == 0) { Left[i] = min(r[i], x - Left[i - 1]); Right[i] = r[i] - Left[i]; } //奇数尽量从右边拿 else{ Right[i] = min(r[i], y - Right[i - 1]);//注意!:原为:y - Right[i - 1] Left[i] = r[i] - Right[i]; } } //for (i = 1; i <= n; i++) // printf("i:%d----l:%d,r:%d\n",i,Left[i],Right[i]); return Left[n] == 0; } int main() { while (~scanf("%d", &n)&&n) { int i, L = 0, R = 0, mid; for (i = 1; i <= n; i++){ scanf("%d", &r[i]); R = max(R, r[i] * 3); } if (n == 1){ printf("%d\n", r[1]); continue; } r[n + 1] = r[1]; for (i = 1; i <= n; i++) L = max(L, r[i] + r[i + 1]); if (n % 2 == 1) { while (L <= R) { mid = (L + R) / 2; if (Judge(mid)){ R = mid - 1; } else{ L = mid + 1; } } printf("%d\n", R + 1); } else printf("%d\n", L ); } return 0; }
相关文章推荐
- 将maven项目转换成普通的web项目
- 异步总结
- 明解C语言1-5
- linux 下配置ant 环境
- Linux命令大全----常用文件操作命令
- oracle中时间运算
- Loadrunner监控Tomcat
- 年来了
- 经典排序算法(Java实现)
- 研究深度学习的硬件配置(折腾GPU)
- <人性的弱点>读书笔记
- linux中文件权限rwx,umask,chwod
- 明解C语言1-4
- 性能の关于性能优化的思考
- KVM虚拟化笔记(二)------kvm虚拟机Linux系统安装
- 陈经:谷歌围棋算法存在缺陷 达不到人类最高水平
- 陈经:谷歌围棋算法存在缺陷 达不到人类最高水平
- MySQL 5.5主从复制(Replication)
- WIN10 安装不了NET3.5
- 关于cat输入