入口: https://cn.vjudge.net/problem/UVA-1335

【题意】

有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物。如果两个相邻的人拥有同一种礼物,则双方都会很不高兴,问最少需要多少种不同的礼物才能满足所有人的需求,假设每种礼物有无限多个

 

【分析】

[蓝书例题]

如果n为偶数的话,ans = max{r[i] + r[i + 1] },(r[n + 1] = r[1]).
如果n为奇数的话,上述式子就不成立了,因为n个人围成圈的话,头尾两人是相邻的,但他们都是奇数位置的人,不能满足奇数尽量取前,偶数尽量取后。所以要用到二分的方法搜索答案,但最关键的是怎么判断说一个值是否可以满足条件。
 

最优分配方案定为已知p种礼物,第一个人取1~r1,偶数号人从小到大取,奇数号人从大到小取(满足相邻不重复),如果最后1和n满足不重复说明合理。然后判断函数用了两个数组left[i],right[i]分别表示第i个人从小到大礼物种类的个数和从大到小礼物种类的个数,最后left[n]如果等于0,那么p满足。根据单调性,二分(最小)答案。


【代码】

#include<cstdio>
#include<iostream>
#define debug(x) cerr<<#x<<" "<<x<<'\n';
using namespace std;
inline int read(){
register char ch=getchar();register int x=0;
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x;
}
const int N=1e5+5;
int n,a[N],le[N],ri[N];
inline bool check(int now){
int x=a[1],y=now-a[1];
le[1]=x,ri[1]=0;
for(int i=2;i<=n;i++){
if(i&1){
ri[i]=min(y-ri[i-1],a[i]);
le[i]=a[i]-ri[i];
}
else{
le[i]=min(x-le[i-1],a[i]);
ri[i]=a[i]-le[i];
}
}
return !le[n];
}
int main(){
for(;n=read();){
int l=0,r=0,mid,ans=0;
for(int i=1;i<=n;i++) a[i]=read();a[n+1]=a[1];
if(n==1){printf("%d\n",a[1]);continue;}
for(int i=1;i<=n;i++) l=max(l,a[i]+a[i+1]),r=max(r,a[i]*3);
if(n&1){
while(l<=r){
mid=l+r>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
}
else{
ans=l;
}
printf("%d\n",ans);
}
return 0;
}

UVA 1335 Beijing Guards(二分答案)的更多相关文章

  1. uva 1335 - Beijing Guards(二分)

    题目链接:uva 1335 - Beijing Guards 题目大意:有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物.如果两个相邻的人拥有同一种礼物, ...

  2. UVa 1335 Beijing Guards (二分+贪心)

    题意:n 个人成一个圈,每个人想要 ri 种不同的礼物,要求相邻两个人没有相同的,求最少需要多少礼物. 析:如果 n 是偶数,那么答案一定是相邻两个人的礼物总种数之和的最大值,那么如果是奇数,就没那么 ...

  3. 【二分答案+贪心】UVa 1335 - Beijing Guards

    Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the Imperial City ...

  4. uva 1335 - Beijing Guards

    竟然用二分,真是想不到: 偶数的情况很容易想到:不过奇数的就难了: 奇数的情况下,一个从后向前拿,一个从前向后拿的分配方法实在太妙了! 注: 白书上的代码有一点点错误 代码: #include< ...

  5. UVa 714 Copying Books - 二分答案

    求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...

  6. UVA 12097 Pie(二分答案)

    题目链接: 这道题虽然不是一道典型的二分答案题,但同样也可以用二分答案来做. 来二分面积为$area$的派,然后看看条件是否矛盾. 与其矛盾的便是$f+1$个人是否每个人都会有. 一个半径为$r$的派 ...

  7. UVA 12124 Assemble(二分答案)

    题目链接:https://vjudge.net/problem/UVA-12124 垃圾vjudge毁我青春!! 首先这道题是解决“最小值最大”的问题,所以要二分答案. 在这里我们二分$quality ...

  8. Uva 长城守卫——1335 - Beijing Guards

    二分查找+一定的技巧 #include<iostream> using namespace std; +; int n,r[maxn],Left[maxn],Right[maxn];//因 ...

  9. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

随机推荐

  1. 树莓派命令行配置连接wifi

    iwlist scan sudovim /etc/wpa_supplicant/wpa_supplicant.conf   network={   ssid="WIFINAME" ...

  2. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  3. 关于Struts2的文件下载

    首先先来说下关于文件下载的原理: 服务端为客户端提供了一个下载服务,所以服务端需要一个输出流(把客户请求下载的文件输出),相对于服务端来说,客户端需要下载接收一个文件,所以它需要一个输入流(接收文件) ...

  4. jmeter正则表达式提取器--关联

    http://desert3.iteye.com/blog/1394934 1.http://www.cnblogs.com/quange/archive/2010/06/11/1756260.htm ...

  5. SQL 语句判断记录是否存在(最简洁简单性能最优)

    今天查了下,发现网上的没有一个sql语句写的好的. 判断记录是否存在,要不是语句不够简洁,要不就是性能有很大问题. 我进行了优化后,最简洁简单性能最优的的sql语句,用来判断表中的记录是否存在: se ...

  6. python 上下文处理错误,记录日志

    之前发过了装饰器版本的异常记录日志,但是需要装饰在函数或方法上.此篇用上下文管理,用一个with就能记录错误了,不需要写成函数. import traceback # pip install mult ...

  7. 修改centos的时间,解决时间比本地实际时间快了8小时

    1.vi /etc/sysconfig/clock #编辑文件ZONE="Asia/Shanghai"UTC=false #设置为false,硬件时钟不于utc时间一致ARC=fa ...

  8. linux 使用supervisor来管理进程

    现在假设一个脚本是,hello.py,内容是 fo = open('xx.txt','w') while 1: fo.write('hello world') print('hi') time.sle ...

  9. [Converge] Backpropagation Algorithm

    Ref: CS231n Winter 2016: Lecture 4: Backpropagation Ref: How to implement a NN:中文翻译版本 Ref: Jacobian矩 ...

  10. Java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...