题解:洛谷 P4409 [ZJOI2006]皇帝的烦恼

题解:洛谷 P4409 [ZJOI2006]皇帝的烦恼

      • 题目大意
      • 思路分析
      • Code

  • 题目地址
  • 题目大意

    • 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=max2Ni=1NAns
    • 如果出现 0.5 \text{0.5} 0.5枚勋章,那么就要向上取整
  • Code

#include 
#include 
#include 
#include 
#include 
#include 
#define re register
#define GC getchar()
#define Max(A,B) (A>B?A:B)
using namespace 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 ;
}
const int Maxn = 200005 ;
int N ,A[Maxn] = {0} , Ans = 0;
long long int 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);
    return 0;
}

你可能感兴趣的:(DP)