zoukankan      html  css  js  c++  java
  • 【BZOJ-1863】trouble 皇帝的烦恼 二分 + DP

    1863: [Zjoi2006]trouble 皇帝的烦恼

    Time Limit: 1 Sec  Memory Limit: 64 MB
    Submit: 559  Solved: 295
    [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

    二分

    Solution

    这道题非常好..即使提示二分,还是不会做

    直接DP,显然不能过。

    我们二分一个答案,然后DP

    $g[i],f[i]$分别表示$i$与$1$的最大/最小 重合个数。

    $f[i]=max(0,a_{i}-[x-a_{i-1}-(a_{1}-g[i-1])]);$

    $g[i]=min(a[i],a_{1}-f[i-1]);$

    这样显然当f[N]==0时,x是可行解

    Code

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int read()
    {
        int x=0,f=1; char ch=getchar();
        while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
        while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    #define MAXN 20010
    int N,a[MAXN],L,R,f[MAXN],g[MAXN];
    bool check(int x)
    {
        f[1]=g[1]=a[1];
        for (int i=2; i<=N; i++)
            f[i]=max(0,a[i]-x-g[i-1]+a[1]+a[i-1]),g[i]=min(a[1]-f[i-1],a[i]);
        return f[N]==0;
    }
    int main()
    {
        N=read();
        int maxx=0;
        for (int i=1; i<=N; i++) a[i]=read(); a[N+1]=a[1];
        for (int i=1; i<=N; i++) maxx=max(maxx,a[i]+a[i+1]);
        int L=maxx,R=maxx*2;
        while (L<=R)
            {
                int mid=(L+R)>>1;
                if (check(mid)) R=mid-1; else L=mid+1;
            }
        printf("%d
    ",L);
        return 0;
    } 

    我本着练习DP的态度去做...然后看了题解.....感觉纸张++

  • 相关阅读:
    SharePoint添加列表
    js求和
    经典.net面试题目
    sharepoint常见操作
    添加webpart时出现“此网页上的某个Web部件或Web表单控件无法显示或导入。该类型未注册为安全类型 。”
    关于js中"window.location.href"、"location.href"、"parent.location.href"、"top.location.href"的用法
    RegisterStartupScript,RegisterClientScriptBlock,Response.Write 简单说明区别
    jquery中的ready函数与window.onload谁先执行
    TreeView的TreeNode点击展示展开和收缩的效果
    如何让 TreeView 的节点不要生成 超级 链接
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5886303.html
Copyright © 2011-2022 走看看