题意:

     有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. Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析

    之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析,通过对LoadModel函数的解析,能够很好理解. ...

  2. SpringMVC-04 数据处理及跳转

    SpringMVC-04 数据处理及跳转 结果跳转方式 1.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析 ...

  3. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  4. 关于ORACLE数据库跨库调用序列的解决办法

    问题  ORACLE  数据库   用户1   xscg  有序列      seq_S_ATTACHMENT_INFO.nextval         我要在  用户2   xsds   里面调用 ...

  5. 【小白学算法】5.链表(linked list)、链表的添加

    链表其实也就是 线性表的链式存储结构,与之前讲到的顺序存储结构不同. 我们知道顺序存储结构中的元素地址都是连续的,那么这就有一个最大的缺点:当做插入跟删除操作的时候,大量的元素需要移动. 如图所示,元 ...

  6. 前端开发:基于cypress的自动化实践

    作为一个伪开发,在一个平台项目中负责前端的开发工作,开发框架为vue,本文我会站在前端开发的角度介绍,我是如何使用cypress的. [x] 如何在vue中使用cypress [x] 如何运行cypr ...

  7. 开源项目月刊《HelloGitHub》第 60 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  8. 你说,怎么把Bean塞到Spring容器?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 小傅哥,你是怎么学习的? 有很多初学编程或者码了几年CRUD砖的小伙伴问我,该怎么学 ...

  9. java例题_24 逆向输入数字

    1 /*24 [程序 24 根据输入求输出] 2 题目:给一个不多于 5 位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. 3 */ 4 5 /*分析 6 * 首先从键盘得到一个正整数,不 ...

  10. Dcoker-搭建日志监控系统

    项目中常用集中日志收集工具 Logstash Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. 优 ...