zoukankan      html  css  js  c++  java
  • 【BZOJ】【1863】【ZJOI2006】trouble 皇帝的烦恼

    二分+DP


      Orz KuribohG

      神题啊= =

      满足单调性是比较显然的……

      然而蒟蒻并不会判断能否满足……QwQ

      神一样的DP姿势:f[i]表示第 i 个与第1个最多有多少个相同,g[i]表示最少。那么如果g[n]==0就表示满足

     1 /**************************************************************
     2     Problem: 1863
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:116 ms
     7     Memory:3616 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 1863
    11 #include<cstdio>
    12 #include<cstring>
    13 #include<cstdlib>
    14 #include<iostream>
    15 #include<algorithm>
    16 #define rep(i,n) for(int i=0;i<n;++i)
    17 #define F(i,j,n) for(int i=j;i<=n;++i)
    18 #define D(i,j,n) for(int i=j;i>=n;--i)
    19 #define pb push_back
    20 using namespace std;
    21 typedef long long LL;
    22 inline int getint(){
    23     int r=1,v=0; char ch=getchar();
    24     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
    25     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
    26     return r*v;
    27 }
    28 const int N=100010;
    29 /*******************template********************/
    30  
    31 int n;
    32 LL a[N],f[N],g[N];
    33 LL l,r,mid;
    34 int main(){
    35 #ifndef ONLINE_JUDGE
    36     freopen("1863.in","r",stdin);
    37     freopen("1863.out","w",stdout);
    38 #endif
    39     n=getint();
    40     F(i,1,n) a[i]=getint();
    41     F(i,1,n-1) l=max(l,a[i]+a[i+1]);
    42     l=max(l,a[n]+a[1]),r=1e10;
    43     if (n%2==0){ printf("%lld
    ",l); return 0;}
    44     while(l<r){
    45         mid=l+r>>1;
    46         f[1]=g[1]=a[1];
    47         F(i,2,n){
    48             f[i]=min(a[i],a[1]-g[i-1]);
    49             g[i]=max(0LL,a[i]-(mid-a[i-1]-(a[1]-f[i-1])));
    50         }
    51         if (g[n]==0) r=mid;
    52         else l=mid+1;
    53     }
    54     printf("%lld
    ",l);
    55     return 0;
    56 }
    57 
    View Code

    1863: [Zjoi2006]trouble 皇帝的烦恼

    Time Limit: 1 Sec  Memory Limit: 64 MB
    Submit: 437  Solved: 229
    [Submit][Status][Discuss]

    Description

    经 过多年的杀戮,秦皇终于统一了中国。为了抵御外来的侵略,他准备在国土边境安置n名将军。不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了。他们拒 绝述职、拒绝接受皇帝的圣旨。秦皇已经准备好了秘密处决这些无礼的边防大将。不过为防兵变,他决定先授予这些将军一些勋章,为自己赢得战略时间。将军们听 说他们即将被授予勋章都很开心,他们纷纷上书表示感谢。第i个将军要求得到ai枚不同颜色的勋章。但是这些将军都很傲气,如果两个相邻的将军拥有颜色相同 的勋章他们就会认为皇帝不尊重他们,会立即造反(编号为i的将军和编号为i+1的将军相邻;因为他们驻扎的边境可以类似看成一个圆形,所以编号1和编号n 的将军也相邻)。皇帝不得不满足每个将军的要求,但对他们的飞扬跋扈感到很气愤。于是皇帝决定铸造尽量少种类的勋章来满足这些狂妄者的要求。请问他至少要 铸造多少种颜色的勋章?

    Input

    第一行有一个整数n(1<=n<=20000)。接下来n行每行一个整数ai,表示第i个将军要求得到多少种勋章。(1<=ai<=100000) 输出一个整数,即最少需要多少种勋章。

    Output

    4 2 2 1 1

    Sample Input

    4

    Sample Output

     

    HINT

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    Fedora 19 配置参考
    Lua 函数、闭包、尾调用总结
    基于MFC简单图片裁剪工具
    【OpenGL 学习笔记04】顶点数组
    【OpenGL 学习笔记03】点画多边形
    【OpenGL 学习笔记02】宽点画线
    【OpenGL 学习笔记01】HelloWorld示例
    【SSH + BootStrap】实现的无线点餐系统
    【C++ 基础 11】 函数指针总结
    【C++基础 10】四种cast转换的区别
  • 原文地址:https://www.cnblogs.com/Tunix/p/4550316.html
Copyright © 2011-2022 走看看