题目大意:给定一个环,每个人要得到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. Animation-list,帧动画+属性动画,做出Flash般的效果

    我们会用到PS,即使不会也不要怂,只需要几步傻瓜式操作即可. 属性动画可以看看我另一篇文章:属性动画详解 效果图 相信机智的各位,看完之后一定能发挥创意,做出更酷更炫的效果 图层获取 首先你需要找一张 ...

  2. 用Vim 加密文本

    Vim强大就在于 可以干任何想要做的事情,比如加密.Fedora 18上给大家做一个测试.首先安装 vim: sudo yum install vim -y然后检验模块是否有加密: vim --ver ...

  3. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  4. cookie解决跨域问题

    v一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入 ...

  5. Java Random介绍

    一.简介 Random类位于java.util包下,此类的实例用于生成伪随机数流.之所以称之为伪随机,是因为真正意义上的随机数(或者称为随机事件)在某次产生过程中是按照实验过程表现的分布概率随机产生的 ...

  6. 防止UI穿透操作到游戏场景

    #if UNITY_EDITOR || UNITY_STANDALONE_WIN if (EventSystem.current.IsPointerOverGameObject()) { return ...

  7. day4、Linux基础题目

    第一题 我想在/data/da 目录下面创建 一个 da.txt 文件 [root@ll ~]# cd /data/oldboyedu -bash: cd: /data/oldboyedu: No s ...

  8. 资源向导之 &quot;APUE&quot;

    APUE --- Advanced programming in the unix environment 这本书我看了好多遍.... 原因嘛, 第一次看到进程那里,看不懂了,前面基础没看好,从头再来 ...

  9. POJ 2195Going Home(网络流之最小费用流)

    题目地址:id=2195">POJ2195 本人职业生涯费用流第一发!!快邀请赛了.决定还是多学点东西.起码碰到简单的网络流要A掉.以后最大流费用流最小割就一块刷. 曾经费用流在我心目 ...

  10. HBase1.0.1基本操作(java代码)

    public class HQuery { private static ConnHBase connHbase=new ConnHBase(); /***************建表******** ...