uva3177BeijingGuards

本文探讨了一个有趣的问题:如何确定最少的礼物种类数量以满足一群人互相赠送不同礼物的需求,并确保相邻两人不会收到相同的礼物。通过简单的算法分析,我们得出了解决方案并提供了C++实现代码。

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

题意:有n个人围城一个圈,其中第i个人想要ri个不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物,如果两个相邻的人拥有同一种礼物,则双方都会很不高兴。问:医用需要多少种礼物才能满足所有人的需要?假设每种礼物有无穷多个,不相邻的两个人不会一起聊天。

分析:《训练指南》上的分析我没看懂,但是我觉得书上讲的麻烦了。当输入完每个人的ri后,统计相邻两个人的ri之和的最大值Max,如果这个Max比应当提供给所有人礼物数的均值的两倍还要少,那么ans=均值的两倍,否则ans=Max,代码写起来也很短:

View Code
 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 const int MAXN = 100000 + 10;
 5 int a[MAXN];
 6 int main(){
 7     int n, i, j;
 8     while(scanf("%d", &n)!=EOF&&n){
 9         int sum =0, Max=0;
10         for(i=0; i<n; i++) scanf("%d", &a[i]);
11         for(i=0; i<n; i++){
12             sum+=a[i];
13             j=i+1;
14             if(j==n) j=0;
15             if(Max<a[i]+a[j]) Max=a[i]+a[j];
16         }
17         int tmp=(sum-1)/(n/2)+1;
18         if(Max<tmp)Max=tmp;
19         printf("%d\n", Max);
20     }
21     return 0;
22 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值