有
N
\text{N}
N个人排成一圈,为第
i
\text{i}
i个人发
A[i]
\text{A[i]}
A[i] 种勋章 ,且相邻两人的勋章种类没有交集, 至少需要的种类数量。
思路分析
当
N
\text{N}
N是偶数时,
Ans
\text{Ans}
Ans 即相邻两人的和的最大值,这个较为显然。
当
N
\text{N}
N是奇数时,
A
n
s
=
m
a
x
∑
i
=
1
N
N
2
,
A
n
s
Ans =max{\frac{\sum_{i=1}^{N}}{\frac{N}{2}},Ans}
Ans=max2N∑i=1N,Ans
如果出现
0.5
\text{0.5}
0.5枚勋章,那么就要向上取整 。
Code
#include<iostream>#include<fstream>#include<string.h>#include<math.h>#include<stdio.h>#include<algorithm>#define re register#define GC getchar()#define Max(A,B) (A>B?A:B)usingnamespace std ;int Qread (){int X =0;char C = GC ;while(C >'9'|| C <'0') C = GC ;while(C >='0'&& C <='9'){
X = X *10+ C -'0';
C = GC ;}return X ;}constint Maxn =200005;int N ,A[Maxn]={0}, Ans =0;longlongint Sum =0;int main (){//freopen ("P4409.in" , "r" , stdin) ;
N =Qread();for(re int i =1; i <= N;++ i){
A[i]= Qread ();
Ans =Max(Ans , A[i -1]+ A[i]);
Sum += A[i];}
Ans = Max (Ans , A[1]+ A[N]);if(N &1){int Give_Per_Time = N /2;int Times =((double)Sum /Give_Per_Time)+1;
Ans = Max (Times , Ans);}
printf ("%d\n", Ans);
fclose (stdin);
fclose (stdout);return0;}