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

这篇博客详细介绍了如何解决ZJOI2006年的题目‘皇帝的烦恼’。当人数N为偶数时,答案是相邻两人勋章种类数之和的最大值;而当N为奇数时,需考虑勋章种类的最大和并处理可能的0.5枚勋章情况。博主分享了贪心策略和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  • 题目地址
  • 题目大意

    • 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 <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)
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值