UVA1335 Beijing Guards
链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4081
题解
对于nnn为偶数偶数直接找最大的ri+ri+1" role="presentation">ri+ri+1ri+ri+1r_i+r_{i+1},你可以通过偶数从上往下放,奇数从下往上放构造出一种合法方案,而且显然ri+ri+1ri+ri+1r_{i}+r_{i+1}就是解的下界
奇数我没想出来怎么处理,看了刘汝佳的题解:第一个人直接从最小的开始放,连续放1...r11...r11...r_1,第二个人从r1+1r1+1r_1+1开始连续放r2r2r_2个,下一个从最大的数开始放,再下一个从最小的数开始放,以此类推,最后第nnn个是从上往下放的,二分上界然后模拟,验证一下中间或者第n" role="presentation">nnn个有没有发生冲突。
他说这样显然是最优的,虽然我无法证明,不过我觉得这样摆放的确是很优的,这种验证方式也的确符合单调的性质。
谁能严谨地证明这种贪心地正确性?
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#define clear(x) memset(x,0,sizeof(x))
#define maxn 100010
using namespace std;
int n, r[maxn], a[maxn], b[maxn], c[maxn];
bool check(int lim)
{int i;clear(a), clear(b), clear(c);c[1]=r[1];c[2]=0,b[2]=r[1]+1, a[2]=r[1]+r[2];for(i=3;i<=n;i++){if(i&1) //ÆæÊýÍùÉÏÈ¡ {if(a[i-1]==0){c[i]=lim-r[i]+1;if(c[i]<=c[i-1])return false;}else if(r[i]<=lim-a[i-1]){c[i]=lim-r[i]+1;}else{c[i]=a[i-1]+1;b[i]=b[i-1]-1;a[i]=b[i]-(r[i]-(lim-c[i]+1))+1;if(a[i]<=c[i-1])return false;}}else //żÊýÍùÏÂÈ¡ {if(a[i-1]==0){c[i]=r[i];if(c[i]>=c[i-1])return false;}else if(r[i]<a[i-1]){c[i]=r[i];}else{c[i]=a[i-1]-1;b[i]=b[i-1]+1;a[i]=b[i]+r[i]-c[i]-1;if(a[i]>=c[i-1])return false;}}}if(a[n])return a[n]>c[1];return c[n]>c[1];
}
int odd()
{int i, l=-1;if(n==1)return r[1];for(i=1;i<n;i++)l=max(l,r[i]+r[i+1]);l=max(l,r[1]+r[n]);int r=maxn<<2, mid=(l+r)>>1;while(l^r){if(check(mid))r=mid;else l=mid+1;mid=(l+r)>>1;}return l;
}
int even()
{int ans=-1, i;for(i=1;i<n;i++)ans=max(ans,r[i]+r[i+1]);ans=max(ans,r[1]+r[n]);return ans;
}
int main()
{int t, i;for(scanf("%d",&n);n;scanf("%d",&n)){for(i=1;i<=n;i++)scanf("%d",r+i);if(n&1)printf("%d\n",odd());else printf("%d\n",even());}return 0;
}
UVA1335 Beijing Guards相关推荐
- UVa1335 Beijing Guards(二分查找)
问题:有n个守卫,构成一个环,分别要求获得ri个礼物,问最少需要准备多少个礼物,使得相邻的两个人礼物各不相同 思路: 假设礼物个数为 p n为偶数情况时,相邻两个要求礼物的和的最大值满足条件 n为奇数 ...
- 长城守卫 Beijing guards CERC 2004 LA3177 解题总结
长城守卫 Beijing guards CERC 2004 LA3177 解题总结 在最小值,最大值的问题 或者没有办法确定答案时候, 可以使用二分答案法. #include <cstdio& ...
- LA3177 - Beijing Guards(二分+贪心【更优美的解法)
简介:同皇帝的烦恼 分析: 如果n是偶数,那么答案就是相邻两个人的r值之和的最大值 即ans=max{r(i)+r(i+1)} (i=1,2,3,-,n),规定r(n+1)=r1 这时的ans实际上是 ...
- [UVALive 3177] Beijing Guards
图片加载可能有点慢,请跳过题面先看题解,谢谢 Uva的题目还是很好的,比如这道,是一道比较好的思维题,代码难度不大 首先处理一下偶数的情况,很简单,答案是相邻两个守卫的礼物和的最大值 这儿请 fhr ...
- 【UVA - 1335】Beijing Guards (贪心,二分)
题干: 题目大意: 有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物.如果两个相邻的人拥有同一种礼物,则双方都会很不高兴,问最少需要多少种不同的礼物才能满 ...
- 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》
虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...
- 《算法竞赛入门经典——训练指南》第一章相关内容
#<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
- oracle数据库 cmd,cmd命令操作Oracle数据库
//注意cmd命令执行的密码字符不能过于复杂 不能带有特殊符号 以免执行不通过 譬如有!@#¥%--&*之类的 所以在Oracle数据库设置密码是不要太复杂 /String Database ...
最新文章
- webpage not available是什么意思_MySQL很想啊,为什么还要有noSQL?
- 001_Ajax简介
- SAP CRM市场营销表结构
- nagios监控三部曲之——nagios实现飞信报警(3)
- 炸了!亚马逊薪资文件泄露!原来这么多人年薪百万
- 【论文复现】使用CNN进行文本分类
- MyCat分片规则之按自然月分片
- 关于火狐浏览器国际版和国内版的说明
- Google Chrome谷歌浏览器清除缓存以及清除Cookie快捷键
- 互联网产品经理必读书目推荐
- 面试官嘲笑我,这你都不会?
- Linux平台总线驱动设备模型
- 微信小程序中使用iconfont阿里巴巴矢量图标
- 用MFC做漂亮界面之美化对话框
- 不重启JVM,对未添加日志的方法添加日志!
- Java-8-Optional类
- 超市管理系统的html页面,基于WEB的超市管理系统_站内搜索_Web开发网
- uploadify上传图片
- 2006-07-16蜡肉的吃法(不完全)
- 视频质量分析工具介绍