UVA1335 Beijing Guards

双倍经验:P4409 [ZJOI2006]皇帝的烦恼

如果只是一条链,第一个护卫不与最后一个护卫相邻,那么直接贪心,找出最大的相邻数的和。

当变成环,贪心很容易找到反例(如[5,5,5],贪心答案为10,实际上为15)

答案存在单调性,考虑二分

那么怎么判断mid是否合理呢?设mx【i】表示第i个数与第一个数最多可以相同多少个,mn【i】 表示第i个数与第一个数至少相同多少个

mx[i]=min(a[i],a[1]-mn[i-1]);

【i-1】最少有mn【i-1】个数与【1】相同,则【i】一定不包括这些数

mn[i]=max(0,a[1]+a[i-1]-mx[i-1]+a[i]-x);

a[i-1]-mx[i-1]是【i-1】至少与【1】不同的个数,加上a【1】是【1】与【i-1】所用的最少个数,那么对于【i】,必须有a[1]+a[i-1]-mx[i-1]+a[i]-x个数与【1】相同才能满足x的限制

那么如果mn【n】==0则说明a[1]+a[i-1]-mx[i-1]+a[i]-x<=0,x可以调小

当n=1直接输出答案

#include<cstdio>
#include<iostream>
using namespace std;
#define R register int
int a[100001],mx[100001],mn[100001],n,l,r,mid;
inline bool check(int x) {
for (R i=2; i<=n; i++) {
mx[i]=min(a[i],a[1]-mn[i-1]);
mn[i]=max(0,a[1]+a[i-1]-mx[i-1]+a[i]-x);
}
return !mn[n];
}
int main() {
while(scanf("%d",&n) && n) {
l=0;
for (R i=1; i<=n; i++) scanf("%d",&a[i]),l=max(l,a[i]+a[i-1]);
if(n==1) {
printf("%d\n",a[1]);
continue;
}
for (mx[1]=mn[1]=a[1],r=300000; l<=r;)
if (check(mid=(l+r)>>1)) r=mid-1;
else l=mid+1;
printf("%d\n",l);
}
}

题解 UVA1335 【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 1335 - Beijing Guards(二分)

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

  3. UVALive 3177 Beijing Guards

    题目大意:给定一个环,每个人要得到Needi种物品,相邻的人之间不能得到相同的,问至少需要几种. 首先把n=1特判掉. 然后在n为偶数的时候,答案就是max(Needi+Needi+1)(包括(1,n ...

  4. LA3177 Beijing Guards

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

  5. UVA-1335(UVALive-3177) Beijing Guards 贪心 二分

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

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

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

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

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

  8. uva 1335 - Beijing Guards

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

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

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

随机推荐

  1. 1级搭建类109-Oracle 12cR2 SI FS(Windows Server 2019)公开

    Oracle 12cR2 单实例文件系统在Windows Server 2019上的安装 在线查看

  2. Python标准库之re模块

    re模块用于正则表达式. 正则表达式在线测试:http://c.runoob.com/front-end/854 正则表达式元字符可以参考:https://www.w3cschool.cn/zheng ...

  3. vue router的嵌套使用与传值的query方式

    嵌套路由 当我们不满足与 /home这种路由,而是希望通过 /home/news和/home/message访问一些内内容 那么就需要嵌套路由了 实现嵌套路由有两个步骤: ·创建对应的子组件,并且在路 ...

  4. 2018ICPC南京站Problem J. Prime Game

    题意: 对于所有数字分解质因子,如果某个质因子在这个区间出现,则贡献为1,求所有质因子对所有区间做的贡献. 解析: 考虑如果所有全部区间都有这个质因子则这个质因子的贡献是n*(n+1)/2,对于任意因 ...

  5. SVM-支持向量机(二)非线性SVM分类

    非线性SVM分类 尽管SVM分类器非常高效,并且在很多场景下都非常实用.但是很多数据集并不是可以线性可分的.一个处理非线性数据集的方法是增加更多的特征,例如多项式特征.在某些情况下,这样可以让数据集变 ...

  6. 手动运行jar包,指定配置文件

    打包程序 mvn package cd target 指定参数运行 java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar --spring.profile.act ...

  7. jQuery里ready方法用原生js实现原理

    function ready(fn){ if(document.addEventListener){ //标准浏览器 document.addEventListener('DOMContentLoad ...

  8. 并查集-D - 畅通工程

    D - 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通 ...

  9. 将用户名密码邮箱制成表格,以用户名为q结束

    print("输入用户名.密码.邮箱长度不能超过20个") s="" while True: v = input("用户名:") if v= ...

  10. 获取 Android APP 版本信息工具类(转载)

    获取 Android APP 版本信息工具类 获取手机APP版本信息工具类 1.获取版本名称 2.获取版本号 3.获取App的名称 package com.mingyue.nanshuibeidiao ...