图片加载可能有点慢,请跳过题面先看题解,谢谢



Uva的题目还是很好的,比如这道,是一道比较好的思维题,代码难度不大

首先处理一下偶数的情况,很简单,答案是相邻两个守卫的礼物和的最大值

这儿请 fhr 给出证明:
把物品排成一行,只要一个人从左边开始取,下一个人从右边开始取,以此类推,保证不会重复
fhr 这人平时虽然脑子不太好使,但这个证明还是不错的。

那么奇数的情况怎么办呢,有一种策略是这样的:
假设有 \(cnt\) 种物品,第一个人取第 \(1~a[1]\) 个,往后走,编号是偶数的人从前往后取,奇数从后往前取,中途必须保证相邻两人取的东西不同。
举个栗子:
就拿样例的第二组数据来说,\(a[]={2,2,2,2,2}\),然后 \(cnt=5\) 。
在这样的情况下,每个人取物品的情况分别为 {1,2},{3,4},{5,2},{1,3},{5,4}。

这个东西啊看起来不那么好处理,但是请注意,这道题是不需要输出方案的,所以我们可以这样:
\(cnt\) 可以通过二分得到,
记 \(l[i]\),\(r[i]\),表示第 \(i\) 个人,在 \(1~a[1]\) 和 \(a[1]+1~cnt\) 各取了多少件,显然 \(l[1]=a[1]\)。
那么这样,每个人都可以根据前一个人的 \(l\) 和 \(r\) 值算出自己的 \(l\) 和 \(r\),判一下是否合法就行。

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int n,ans,a[100010];
int l[100010],r[100010];il void init(){ ans=0;for(RG int i=1;i<=n;i++) a[i]=gi();for(RG int i=2;i<=n;i++) ans=max(ans,a[i]+a[i-1]); ans=max(ans,a[1]+a[n]);
}il bool ck(int x){ RG int k=x-a[1]; l[1]=a[1];for(RG int i=2;i<=n;i++){if(!(i%2)) l[i]=min(a[i],a[1]-l[i-1]),r[i]=a[i]-l[i];else r[i]=min(a[i],k-r[i-1]),l[i]=a[i]-r[i];if(l[i]+r[i]>x) return 0;if(l[i]<0||r[i]<0) return 0;}if(l[n]>0) return 0;return 1;
}il void work(){if(n==1){ printf("%d\n",a[1]); return ; }if(!(n%2)){ printf("%d\n",ans); return ; }RG int l=ans,r=l<<1;while(l<=r){RG int mid=(l+r)>>1;if(ck(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);
}int main(){ while(scanf("%d",&n)&&n){ init(); work(); } return 0; }

转载于:https://www.cnblogs.com/Hero-of-someone/p/7651589.html

[UVALive 3177] Beijing Guards相关推荐

  1. 长城守卫 Beijing guards CERC 2004 LA3177 解题总结

    长城守卫 Beijing guards CERC 2004 LA3177 解题总结 在最小值,最大值的问题 或者没有办法确定答案时候,  可以使用二分答案法. #include <cstdio& ...

  2. LA3177 - Beijing Guards(二分+贪心【更优美的解法)

    简介:同皇帝的烦恼 分析: 如果n是偶数,那么答案就是相邻两个人的r值之和的最大值 即ans=max{r(i)+r(i+1)} (i=1,2,3,-,n),规定r(n+1)=r1 这时的ans实际上是 ...

  3. UVa1335 Beijing Guards(二分查找)

    问题:有n个守卫,构成一个环,分别要求获得ri个礼物,问最少需要准备多少个礼物,使得相邻的两个人礼物各不相同 思路: 假设礼物个数为 p n为偶数情况时,相邻两个要求礼物的和的最大值满足条件 n为奇数 ...

  4. 【UVA - 1335】Beijing Guards (贪心,二分)

    题干: 题目大意: 有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物.如果两个相邻的人拥有同一种礼物,则双方都会很不高兴,问最少需要多少种不同的礼物才能满 ...

  5. UVA1335 Beijing Guards

    链接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  6. oracle数据库 cmd,cmd命令操作Oracle数据库

    //注意cmd命令执行的密码字符不能过于复杂 不能带有特殊符号 以免执行不通过 譬如有!@#¥%--&*之类的  所以在Oracle数据库设置密码是不要太复杂 /String Database ...

  7. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  8. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  9. OI 刷题记录——每周更新

    每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...

最新文章

  1. 查询出每个部门比本部门平均工资高的职工人数
  2. 正确使用硬盘的方法与维护
  3. 中间人攻击框架以及工具,中国寒龙出品欢迎下载!~
  4. Laravel 5.0 的新特性
  5. 软考-信息系统项目管理师-项目组合管理
  6. 面试再也不怕问到HashMap(二)
  7. 编写你的第一个 Django 应用,第 1 部分
  8. 商友ERP系统---结算方面几项事宜
  9. spring源码解析专栏导航
  10. 前端学习——Js(JavaScript)入门
  11. 优动漫PAINT的变形文字工具教程
  12. 计算机粘贴复制快捷键,电脑粘贴复制快捷键ctrl加什么(电脑快捷键方法大全)...
  13. python生成简单二维码_使用Python生成个性二维码
  14. UOJ#405. 【IOI2018】组合动作
  15. MATLAB 绘制sinc函数的简单代码
  16. 【IoT】 产品设计之α、β、λ测试
  17. vue3获取当前日期和时间
  18. win10下samba 重新登录注销
  19. HTML5+CSS3 02(表格、表单标签、语义化,字符实体标签)
  20. 【Unity小游戏】 | 愤怒的小鸟

热门文章

  1. java webapps路径_java 获取服务器端的webapps路径 | 学步园
  2. win10远端服务器未响应,win10怎么连远程服务器未响应
  3. 修改mysql字符集_mysql 修改字符集
  4. java 铁三车强度如何_工欲善其事,必先利其器--GIANT TRINITY铁三车
  5. 搜百度 php教程,jquery php 百度搜索框智能提示效果_PHP教程
  6. laravel 控制器 中间件 传递数据_Laravel5 自定义路由中间件的使用步骤,太好用,珍藏了!...
  7. 云服务器变成多个挂机宝销售,云服务器变成挂机宝
  8. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)
  9. linux 切图软件下载,学会23个linux常用命令,不做前端切图仔~
  10. java面试题十八 switch一个考题