题意:

     有n个人围成一个圈,每个人都有r[i]个礼物,任意两个相邻的人的礼物不能有重复的,问满足所有相邻不重复的最少礼物种数是多少?就是问最少多少种礼物能让任意相邻的两个人的礼物不重复。

思路:

     比较有意思的一个题目,首先这个题目很多人包括我的第一反应就是任意两个相邻的和中最大的那个和,但是这样只适应偶数的情况,那么我们就分两种情况来考虑,首先是偶数,偶数比较简单,就是任意两个相邻的数都做一个和,别忘记1,n也做一次和,也就是这样Ans = max(Ans ,num[i] + num[i-1])最后直接输出Ans就行了,为什么这样是正确的?我们可以这样理解,我们可以让奇数的位置尽可能的小,偶数的位置尽可能的大(可以调换),那么最后的n是尽可能的大的,而1是尽可能的小的,随意不冲突,这样的话最终的答案就是某一对的最大值了,下面考虑奇数的情况,奇数的情况不能直接像偶数那样枚举,因为最后的n是尽可能的小,而1也是尽可能的小,显然不是最优,我们可以先把1固定,就是1,2,3,4..r[1],而偶数的位置尽可能的小,奇数的位置尽可能的大,这样n是尽可能大的,而1被固定了,是尽可能小的,这样就不冲突了,但是这种情况的答案是不能直接算出来的,我们可以二分去枚举答案,对于每一个当前值mid,我们就把mid想象成最大的个数,然后去判断是否满足要求,判断的过程是开两个数组,lift[i],right[i],前面的是表示当前这一位用了多少个r[1]以下的数字,第二个数组表示的是当前这一位用了多少个r[1]以上的数字,对于每一位我们根据奇偶来判断是优先在lift上加还是优先在right上加,对于某一位,当上一位剩下的lift+剩下的right
< r[i]的时候,就表示冲突了,如果过程中没有冲突,最后的时候我们还要判断n,1是否冲突,因为lift[1] = 下边界的,所以lift[n]必须等于0才行,这也是为什么lift和right的边界是r[1]的原因,如果是别的数字的话最后就没有办法判断n,1是否冲突了。

#include<stdio.h>

int num[110000];

int lift[110000] ,right[110000];

bool ok(int mid ,int n)

{

    lift[1] = num[1];

    right[1] = 0;

    int ll = num[1] ,rr = mid - num[1];

    for(int i = 2 ;i <= n ;i ++)

    {

       if(i % 2 == 0)

       {

           if(ll - lift[i-1] >= num[i])

           {

               lift[i] = num[i];

               right[i] = 0;

           }

           else if(ll - lift[i-1] + rr - right[i-1] >= num[i])

           {

               lift[i] = ll - lift[i-1];

               right[i] = num[i] - lift[i];

           }

           else return 0;

       }

       else

       {

           if(rr - right[i-1] >= num[i])

           {

               right[i] = num[i];

               lift[i] = 0;

           }

           else if(rr - right[i-1] + ll - lift[i-1] >= num[i])

           {

                right[i] = rr - right[i-1];

                lift[i] = num[i] - right[i];

           }

           else return 0;

       }

    }

    return !lift[n];

}

int main ()

{

    int n ,i ,Max ,Min;

    while(~scanf("%d" ,&n) && n)

    {

       Max = -1 ,Min = 110000;

       for(i = 1 ;i <= n ;i ++)

       {

          scanf("%d" ,&num[i]);

          if(Max < num[i]) Max = num[i];

          if(Min > num[i]) Min = num[i];

       }

       if(n == 1)

       {

            printf("%d\n" ,num[1]);

            continue;

       }

       if(!(n%2))

       {

          num[0] = num[n];

          int Ans = 0;

          for(i = 1 ;i <= n ;i ++)

          if(Ans < num[i] + num[i-1])

          Ans = num[i] + num[i-1];

          printf("%d\n" ,Ans);

          continue;

       }

       int low ,up ,mid ,Ans;

       low = Min ,up = Max * 3;

       while(low <= up)

       {

          mid = (low + up) >> 1;

          if(ok(mid ,n)) Ans = mid ,up = mid - 1;

          else low = mid + 1;

       }

       printf("%d\n" ,Ans);

    }

    return 0;

}

       

       

          

LA3177长城守卫的更多相关文章

  1. LA 3177 长城守卫

    n为偶数的时候比较简单,就是相邻两个守卫的礼物和的最大值. 首先这是个下限,其次这个值也满足题目要求,所以这就是答案了. 当n为奇数的时候上限是守卫索要礼物的最大值的三倍. 这也很容易理解,比如n=5 ...

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

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

  3. UVALive 3177 长城守卫

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

  4. L3-009 长城 (30 分)

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  5. pat 团体天梯赛 L3-009. 长城

    L3-009. 长城 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 邓俊辉(清华大学) 正如我们所知,中国古代长城的建造是为了抵御外 ...

  6. cccc初赛 L3-003 长城

    L3-009. 长城 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 邓俊辉 正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长 ...

  7. 【TYVJ1864】[Poetize I]守卫者的挑战 概率与期望

    [TYVJ1864][Poetize I]守卫者的挑战 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我 ...

  8. effective java —— 终结方法守卫者

    目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...

  9. ftp列表错误或长城宽带连不上ftp的解决方法

    有些是长城宽带,我 帮忙测试,在客户PC机上测试,PING 任何网站 不通:tracert 超时:FTP 超时,不出现用户名提示.但访问网站正常,检测后进入到路由器,禁用DHCP服务 ,问题解决. 或 ...

随机推荐

  1. 几大BSD 区别

    OpenBSD 侧重于安全,软件包较少,较陈旧,比如 KDE 才 3.5,为了安全舍弃了 sudo 和 linux 兼容层: FreeBSD 是开发者最多用户最多软件包最多的,有 ZFS 和 Linu ...

  2. 开源大屏工具 DataGear 的使用

    记录一款好用的大屏工具,DataGear,官方标记为"开源免费的数据可视化分析平台". 其支持的数据集可以为SQL或HTTP API等,SQL支持MySQL等关系型数据库及Hive ...

  3. 【odoo14】第一章、安装odoo的开发环境

    有几种方式去设置odoo的开发环境,我们将逐个介绍他们. 如果你之前没有接触过odoo的开发环境,那么有几个必要的概念你是需要了解的.在这一章节中,我们首先介绍odoo的生态.然后我们在进行介绍odo ...

  4. 2019 GDUT Rating Contest I : Problem G. Back and Forth

    题面: G. Back and Forth Input file: standard input Output file: standard output Time limit: 1 second Mem ...

  5. C# 调用HTTP接口两种方式

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  6. Springboot2.x集成lettuce连接redis集群报超时异常Command timed out after 6 second(s)

    文/朱季谦 背景:最近在对一新开发Springboot系统做压测,发现刚开始压测时,可以正常对redis集群进行数据存取,但是暂停几分钟后,接着继续用jmeter进行压测时,发现redis就开始突然疯 ...

  7. github文件快速下载

    目录 一,提升加载速度 二,提升下载速度 只是想快速下载文件的直接看第二部分. github加载速度慢究其原因还是伟大的墙的存在.我们需要赞美墙,但就算墙很伟大,问题还是要解决的. 有问题就解决问题, ...

  8. AutoPy开发文档

    AutoPy 简介 AutoPy是为python开发者提供的一个安卓插件,由路飞大佬开发维护,主要功能为了实现使用python在安卓端完成一些操作,例如点击,滑动,返回 准备 安装AutoPy.apk ...

  9. Kubernetes 实战 —— 04. 副本机制和其他控制器:部署托管的 pod

    保持 pod 健康 P84 只要 pod 调度到某个节点,该节点上的 Kubelet 就会运行 pod 的容器,从此只要该 pod 存在,就会保持运行.如果容器的主进程奔溃, Kubelet 就会自动 ...

  10. 获取执行计划之Autotrace

    Autotrace 简介 AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计. AUTOTRACE的好处是您不必设置跟踪文件的格式,并且 ...