题目大意:给定一个环,每个人要得到Needi种物品,相邻的人之间不能得到相同的,问至少需要几种。

首先把n=1特判掉。

然后在n为偶数的时候,答案就是max(Needi+Needi+1)(包括(1,n))。

证明:把物品排成一行,只要一个人从左边开始取,下一个人从右边开始取,以此类推,保证不会重复。

然后在n为奇数的时候,答案就不好做了。

观察一下这道题,发现答案满足可二分性,不如思考一下check怎么写。

因为n为奇数时难点就在看n与1是否矛盾上,只要解决了这个问题,一切好说。

不难发现答案下界就是max(Needi+Needi+1)(包括(1,n)),上界开大一点无所谓的。

还是把物品排成一行,第一个人从左边开始取。

要使第n个人和第1个人尽量不矛盾,不如让他从最后开始选。

然后n-1就从前面开始选。

一路逆推回来,你会发现:让2从左边开始选。

什么?1不是从左边开始选的吗?为什么2也从左边开始选呢?

因为我们二分的mid是可以保证(i,i+1)之间一定不矛盾的,所以从2开始做就是为了n号点与1号点的尽量不矛盾。

换句话说,不会转过圈的都是一定满足的,所以就是要把它们以一种合适的方式排布,成全n和1这一对。

感觉在下一盘惊天大棋?

至于维护方式,也是比较巧(套)妙(路)的。

有mid个物品,第一个人选了前Need[1]个,我们就把这些物品分成左右,[1,Need[1]]和[Need[1]+1,mid]。

记L[i]和R[i]表示i在左边/右边取了多少个。

对于偶数位,由推导,我们尽量从左边选。

L[i]=min(Need[i],Need[1]-L[i-1]),R[i]=Need[i]-L[i]。

对于奇数位,尽量从右边选。

R[i]=min(Need[i],(mid-Need[1])-R[i-1]),L[i]=Need[i]-R[i]。

最后,因为1把L全部取完了,我们只要看L[n]==0即可。

真是妙。

#include    <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <complex>
#include <stack>
#define LL long long int
#define dob double
#define FILE "3177"
using namespace std; const int N = ;
int n,Ned[N],L[N],R[N]; inline int gi(){
int x=,res=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')res*=-;ch=getchar();}
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*res;
} inline bool check(int mid){
int Lh=Ned[],Rh=mid-Ned[];
L[]=Lh;R[]=;
for(int i=;i<=n;++i)
if(i&){
R[i]=min(Ned[i],Rh-R[i-]);
L[i]=Ned[i]-R[i];
}
else{
L[i]=min(Ned[i],Lh-L[i-]);
R[i]=Ned[i]-L[i];
}
return L[n]==;
} int main()
{
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
while(n=gi()){
for(int i=;i<=n;++i)Ned[i]=gi();
if(n==){printf("%d\n",Ned[]);continue;}
int Ans=Ned[n]+Ned[];
for(int i=;i<n;++i)
Ans=max(Ans,Ned[i]+Ned[i+]);
if(n&){
int l=Ans,r=Ans*;Ans=r;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))r=mid-,Ans=mid;
else l=mid+;
}
}
printf("%d\n",Ans);
}
fclose(stdin);fclose(stdout);
return ;
}

Beijing Guards

UVALive 3177 Beijing Guards的更多相关文章

  1. LA 3177 Beijing Guards(二分法 贪心)

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

  2. Uva LA 3177 - Beijing Guards 贪心,特例分析,判断器+二分,记录区间内状态数目来染色 难度: 3

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  3. uva 1335 - Beijing Guards(二分)

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

  4. LA3177 Beijing Guards

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

  5. 题解 UVA1335 【Beijing Guards】

    UVA1335 Beijing Guards 双倍经验:P4409 [ZJOI2006]皇帝的烦恼 如果只是一条链,第一个护卫不与最后一个护卫相邻,那么直接贪心,找出最大的相邻数的和. 当变成环,贪心 ...

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

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

  7. UVALive 3177 长城守卫

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. uva 1335 - Beijing Guards

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

  9. UVA 1335 Beijing Guards(二分答案)

    入口: https://cn.vjudge.net/problem/UVA-1335 [题意] 有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物.如果两个 ...

随机推荐

  1. 从Proxy.newInstance出发

    写在前面 本篇博客是基于对动态代理,java的重写,多态特性了解的基础上对于源码的阅读,先提出几个问题 1.从静态代理变成动态代理需要解决两个问题,如何动态实现被代理类的接口并摘取接口中的方法,如果动 ...

  2. 契约测试框架-Pact实践

    在前一篇博客中我们讲到契约测试是什么,以及它能给我们软件交付带来什么价值,本次将介绍一个开源的契约测试框架Pact,它最初是用ruby语言实现的,后来被js,C#,java,go,python 等语言 ...

  3. robotframework自动化系统:操作mysql数据库

    随着项目自动化深入和不断完善,大部分功能都已经能完成了自动化的操作:但是在设备添加的时候,遇到了难题.添加设备的时候mac必须是服务器设备管理中已经存在的mac地址,且是没有关联或绑定用户的设备信息. ...

  4. SQL基础知识一

    一.建库 show databases ;//显示已存在的数据库 create database 数据库库名; use 数据库名;//进入新建的数据 二.建表 show tables;//查询已存在的 ...

  5. 整合SSH时,遇到了org.springframework.beans.factory.BeanCreationException错误

    严重: StandardWrapper.Throwableorg.springframework.beans.factory.BeanCreationException: Error creating ...

  6. Awk,Cat,Head分析Nginx日志常用命令

    Nginx 日志分析   1.根据访问IP统计UV   awk '{print $1}'  access.log|sort | uniq -c |wc -l   2.统计访问URL统计PV   awk ...

  7. MYSQL常见运算符和函数

    字符函数 (1)CONCAT():字符连接 SELECT CONCAT('IMOOC','-','MySQL');//IMOOC-MySQL SELECT CONCAT (first_name,las ...

  8. suds库使用说明官方文档

    OVERVIEW The Suds web services client is a lightweight soap-based client for python the is licensed ...

  9. JavaWeb 之文件的上传下载

    又到了每周更新博客的时候了,每看到自己发布的随笔阅读量上涨的时候就特别开心,我也会尽自己的努力提高自己的水平,总结出通俗易读的学习笔记,还望大家能多多支持!!! ------------------- ...

  10. mustache.js 使用

    对于mustache模板,我是属于即用即查的方法,以下记录仅是我常用的方式.方便以后使用时不用再去项目中去找,因为真的不好找.(此处 -->serious 脸) 当需要渲染一些数据列表的时候,使 ...