码迷,mamicode.com
首页 > 其他好文 > 详细

sunshine的神题(from2015.10.23)

时间:2015-10-23 22:55:04      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:

codevs1513 皇帝的烦恼

题目大意:给定n个点成环,每个点要求染ai个颜色,要求相邻两点不能有相同颜色,求最少颜色。

思路:二分+dp。fi[i]表示i这个点和1最少相同颜色;gi[i]表示i这个点和1最多颜色,互相更新一下。如果fi[n]==0则可以(中间还要注意如果相邻两个点的和大于x也要返回false)。

orz sunshineorz sunshineorz sunshine

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxm 20005
using namespace std;
int ai[maxm]={0},fi[maxm]={0},gi[maxm]={0},n;
bool judge(int x){
    int i,j;
    memset(fi,127,sizeof(fi));
    memset(gi,0,sizeof(gi));
    fi[1]=gi[1]=ai[1];
    for (i=2;i<=n;++i){
        if (ai[i]+ai[i-1]>x) return false;
        fi[i]=max(0,ai[i]-((x-ai[1])-(ai[i-1]-gi[i-1])));
        gi[i]=min(ai[i],ai[1]-fi[i-1]);
    }return fi[n]==0;
}
int main(){
    int i,l,r=0,mid;scanf("%d",&n);
    for (i=1;i<=n;++i){scanf("%d",&ai[i]);r+=ai[i];}
    l=ai[1];
    while(l!=r){
        if (judge(mid=(l+r)>>1)) r=mid;
        else l=mid+1;
    }printf("%d\n",l);
}
View Code

 

sunshine的神题(from2015.10.23)

标签:

原文地址:http://www.cnblogs.com/Rivendell/p/4905738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!