ZJOI2008皇帝的烦恼
描述
经过多年的杀戮,秦皇终于统一了中国。为了抵御外来的侵略,他准备在国土边境安置 n 名将军。
不幸的是这 n 名将军羽翼渐丰,开始展露他们的狼子野心了。他们拒绝述职、拒绝接受皇帝的圣旨。秦皇已经准备好了秘密处决这些无礼的边防大将。不过为 防兵变,他决定先授予这些将军一些勋章,为自己赢得战略时间。
将军们听说他们即将被授予勋章都很开心,他们纷纷上书表示感谢。第i个将军要求得到ai枚不同颜色的勋章。但是这些将军都很傲气,如果两个相邻的将 军拥有颜色相同的勋章他们就会认为皇帝不尊重他们,会立即造反(编号为i的将军和编号为i+1 的将军相邻;因为他们驻扎的边境可以类似看成一个圆形,所 以编号 1 和编号n的将军也相邻)。
皇帝不得不满足每个将军的要求,但对他们的飞扬跋扈感到很气愤。于是皇帝决定铸造尽量少种类的勋章来满足这些狂妄者的要求。请问他至少要铸造多少 种颜色的勋章?
输入
输入文件第一行有一个整数 n(1<=n<=20000)。 接下来 n 行每行一个整数 ai,表示第 i 个将军要求得到多少种勋章。 1<=ai<=100000)
输出
输出一个整数,即最少需要多少种勋章。
标签
zjoi2006
这道题真的是神奇,惊呆了
如果n是偶数,显然直接贪心过去,相邻之间取最大值输出,这样可以得到60分(orz)
如果是奇数,那么就会出锅,因为最后相邻的两个人的勋章如果用之前的肯定是会出问题的
按照洛谷的题解,实质上就是每种勋章不能发给超过n/2个将军,然后直接除下就是答案了orz,但还是要跟贪心比一下取最大
神奇啊啊啊啊啊啊啊啊
这道题意义在于横向思考每个勋章,贪心实际上是一种纵向思考,考虑每个将军拥有的勋章个数,而这个是从每一枚勋章开始考虑,毕竟每个都是独一无二的(逃
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 int a[20005]; 6 int main(){ 7 int n; 8 cin>>n; 9 int max0=0,min0=99999999; 10 int sum=0; 11 for(int i=1;i<=n;i++){ 12 cin>>a[i]; 13 sum+=a[i]; 14 min0=min(min0,a[i]); 15 if(i>1)max0=max(max0,a[i]+a[i-1]); 16 } 17 max0=max(max0,a[n]+a[1]); 18 if(n%2==0) 19 cout<<max0; 20 else{ 21 double t=sum; 22 t=ceil(t*1.0/((n/2)*1.0)); 23 cout<<max(max0,(int)t); 24 } 25 return 0; 26 }