二分+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\n",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\n",l); 55 return 0; 56 } 57
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
时间: 2024-11-24 11:09:20