题干:

题目大意:

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

解题报告:

http://www.cnblogs.com/kickit/p/7619889.html

http://www.bubuko.com/infodetail-645767.html

总之就是偶数个的时候直接贪出相邻两者的最大值就可以。

奇数的时候:先单独安排第一个,并以这一个为分界线分为左右两个区域部分,然后剩下的分奇偶进行安排(第奇数个尽量往右安排,第偶数个尽量往左安排),然后安排到最后一个一定是尽量往右安排的,然后我们看这个是否和第一个有冲突就行了,如果没有冲突那一定是可以的,如果有冲突那一定就是说明我们用的李无数是不够的,因为我们这样一定是最优解了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX = 2e5 + 5;
int a[MAX];
int L[MAX],R[MAX];
int n;
bool ok(int x) {int l=a[1],r=x-a[1];L[1]=a[1];R[1]=0;for(int i = 2; i<=n; i++) {if(i%2==1) {R[i] = min(r-R[i-1],a[i]);L[i] = a[i]-R[i];}else {L[i] = min(l-L[i-1],a[i]);R[i] = a[i]-L[i];}}return L[n]==0;//填L[n]<=0也可以AC,,但是在这里还是==0比较好理解,因为L和R这两个数组都不存在为负情况。}
int main()
{while(~scanf("%d",&n)) {if(n == 0) break;int maxx = 0;for(int i = 1; i<=n; i++) {scanf("%d",a+i);maxx = max(maxx,a[i]+a[i-1]);}maxx = max(maxx,a[1]+a[n]);if(n == 1) {printf("%d\n",a[1]);continue;}else if(n % 2 == 0) {printf("%d\n",maxx);continue;}int l = maxx,r = INF;int mid = (l+r)>>1;while(l < r) {mid = (l+r)>>1;if(ok(mid)) r = mid;else l = mid+1;}printf("%d\n",l);}return 0 ;}

【UVA - 1335】Beijing Guards (贪心,二分)相关推荐

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

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

  2. UVA - 1471 Defense Lines 贪心+二分

    题目大意:给出长度为n的序列,要求你删除掉一段的连续子序列,使得剩下的序列的递增子序列最长 解题思路:记录以下每个位置的值所能延伸的最左端和最右端,用一个数组记录长度为i的数的最小值,然后从左往右扫描 ...

  3. UVa1335 Beijing Guards(二分查找)

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

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

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

  5. [SCOI2005]栅栏(贪心+二分+dfs)难度⭐⭐⭐⭐

    [SCOI2005]栅栏(贪心+二分+dfs) P2329 [SCOI2005]栅栏 题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材. ...

  6. 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

    题目传送门 1 /* 2 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 3 当然有可能两个数和超过p,那么an ...

  7. LIS最长上升子序列详解(动态规划、贪心+二分、树状数组)

    1.摘要: 关于LIS部分,本篇博客讲一下LIS的概念定义和理解,以及求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,最后附上几 ...

  8. UVA 1616 Caravan Robbers 【二分+贪心+枚举分母】

    题目链接 题意 给n个互不相包含的区间,求出一个长度的最大值,使得可以在每个区间中选出这样一个长度的子区间,这些子区间互不相交.结果用分数表示 分析 先考虑如果给定了区间长度能不能选出这样的区间.因为 ...

  9. UVA1335 Beijing Guards

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

最新文章

  1. mfc清空数组_MFC数组的使用
  2. CODEVS-3303-翻转区间
  3. 课程表—leetcode207
  4. python数据可视化的特点_Python数据可视化, 看这一篇就够了
  5. concat特征融合_深度特征融合---理解add和concat之多层特征融合
  6. 肖仰华 | SIGIR 2018、WWW2018 知识图谱研究综述
  7. Layer 提示框tips使用
  8. 形态学空间格局分析(MSPA)—ArcGIS结合Guidos软件
  9. html5 获取剪切板内容,H5剪切板功能
  10. KEIL环境中添加宏定义方法
  11. 基于VS2015MFC在X86debug编译平台调试opengl 代码出现oxc0000007b错误的解决方法
  12. 2019年6月1日第十四周UML项目日志
  13. pgpool 主从流复制模式下的安装使用
  14. 【读者来信】你所认识的世界不一定是真实的
  15. php移除excel密码,excel2007密码怎么取消
  16. RxSwift实战经验
  17. 88是python的整数类型吗_python基本数据类型
  18. matlab 文字版,MATLAB图书合集×110本免费奉送(All MATLAB Books Collection)文字版[PDF]
  19. win10 系统网络驱动出现黄色感叹号
  20. 原神私服 grasscutter搭建及食用教程

热门文章

  1. pat 1085 Perfect Sequence (25) 二分查找
  2. K-Dominant Character CodeForces - 888C 思维 构造
  3. 在STM32CubeMX生成的MDK5工程上添加RT-Thread Nano后双击工程名无法打开.map文件的解决方法
  4. 【复习】使用 SQLiteDatabase 操作 SQLite 数据库
  5. stc8g1k08程序范例_通过WiFi对STC单片机程序下载和调试
  6. 和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!
  7. 在飞音G801上运行OpenWRT+Asterisk
  8. WinCE驱动调试助手V2.5
  9. WinCE流设备驱动简介及GPIO驱动的实现
  10. 定界符在php中,php定界符如何使用