信息学奥赛一本通 1229:电池的寿命 | OpenJudge NOI 4.6 2469:电池的寿命
【题目链接】
ybt 1229:电池的寿命
OpenJudge NOI 4.6 2469:电池的寿命
【题目考点】
1. 贪心
【解题思路】
1. 贪心选择性质的证明
电池分配主要有两步,
第一步:将电池分为两组,使两组电池的总使用时长的差值尽可能小。
第二步:如果总时长更长的分组中有多于1个电池,那么取出这一组中的一些电池运行游戏机,消耗其中一些电池的电量,使得两组电池的使用时长相等。
第三步:两组电池分别装在游戏机的两个电池位置上,运行游戏机。
已知有n个电池,将其电池分为两组,第1组时长加和为aaa,第2组时长加和为bbb。
不失一般性,假设最后第1组使用时长大于等于第二组,即a≥ba\ge ba≥b。其差值d=a−bd = a-bd=a−b。
定义消耗操作:在某一组电池中取出一对电池使用,游戏机运行m2\frac{m}{2}2m时长,共消耗电池使用时长mmm。
贪心选择:按使用时长从大到小选择电池,将其加入电池使用时长加和更小的分组中。
在所有电池都分配结束后
如果使用时长更长的第1组中只有1个电池,其它所有电池都在第2组。那么这也就是最优的方案了,此时游戏机可以运行的时长为bbb,即为电池中除了使用时长最长的电池,其余电池使用时长的加和。
只要第1组中的电池数量大于1,那么一定可以通过1次消耗操作让第1组的电池消耗掉使用时长ddd,进而让两组电池的使用时长加和相同。
证明:在第1组最后一节电池加入时,一定是第1组的使用时长加和a1a_1a1小于等于第2组的加和b1b_1b1,即a1≤b1a_1\le b_1a1≤b1。而后第1组加入最后一节电池,其时长为aea_eae,此时第1组电池使用时长a=a1+aea = a_1+a_ea=a1+ae,其后第2组加入了0节或多节电池,这些电池的总时长为beb_ebe,最后第2组电池的使用时长b=b1+beb = b_1 + b_eb=b1+be
那么两组电池使用时长的差值d=a−b=a1+ae−b1−be=ae−(b1−a1)−bed = a - b = a_1+a_e - b_1 - b_e = a_e - (b_1-a_1) - b_ed=a−b=a1+ae−b1−be=ae−(b1−a1)−be,由于b1−a1≥0b_1-a_1\ge 0b1−a1≥0且be≥0b_e \ge 0be≥0,所以d≤aed \le a_ed≤ae。
由于第1组中不只有1节电池,根据贪心选择,其中已经存在的电池的时长一定大于等于后面加入的电池的时长。所以第1组中除了最后一节电池,一定存在时长为ama_mam的某电池满足am≥aea_m \ge a_eam≥ae,取出这两节电池放入游戏机中运行,运行时长d2\frac{d}{2}2d,共消耗时长ddd。由于d2≤d≤ae≤am\frac{d}{2} \le d \le a_e \le a_m2d≤d≤ae≤am,所以一定可以做到运行这么久。
此时第1组电池的剩余总运行时长为a−d=ba - d = ba−d=b,与第2组电池的总运行时长相同。分别取第1组和第2组的电池放在游戏机的两个电池空位上,运行游戏机,还可以运行bbb时长。这种方案下,电池电量没有一点浪费,游戏机可以运行的总时长为所有电池可以使用的总时长除以2。
2. 具体做法
将输入的数据存入数组,求其中的最大值及所有数的总和。总和减最大值为剩余数字和。
如果最大值大于等于剩余数字和,那么结果为剩余数字和。否则,输出总和除以2。
【题解代码】
解法1:贪心
#include<bits/stdc++.h>
using namespace std;
#define N 1005
int main()
{double a, ans;int n;while(cin >> n){double mx = 0, sum = 0;for(int i = 1; i <= n; ++i){cin >> a;mx = max(mx, a);sum += a;}if(sum - mx < mx)ans = sum - mx;elseans = sum / 2;cout << fixed << setprecision(1) << ans << endl;} return 0;
}
信息学奥赛一本通 1229:电池的寿命 | OpenJudge NOI 4.6 2469:电池的寿命相关推荐
- 信息学奥赛一本通 1209:分数求和 | OpenJudge NOI 1.13 12:分数求和
[题目链接] ybt 1209:分数求和 OpenJudge NOI 1.13 12:分数求和 [题目考点] 1. 求最大公约数 2. 求最小公倍数 [解题思路] 求最大公约数,可以用辗转相除法.具体 ...
- 信息学奥赛一本通 1294:Charm Bracelet | OpenJudge NOI 2.6 7113:Charm Bracelet | 洛谷 P2871
[题目链接] ybt 1294:Charm Bracelet OpenJudge NOI 2.6 7113:Charm Bracelet 洛谷 P2871 [USACO07DEC]Charm Brac ...
- 信息学奥赛一本通 1173:阶乘和 | OpenJudge NOI 1.6 15 | 洛谷 P1009 [NOIP1998 普及组] 阶乘之和
[题目链接] ybt 1173:阶乘和 注:一本通上这题,应该把n≤50n\le50n≤50当做n≤100n\le100n≤100来看 OpenJudge NOI 1.6 15:阶乘和 洛谷 P100 ...
- 信息学奥赛一本通 1232:Crossing River | OpenJudge NOI 4.6 702:Crossing River
[题目链接] ybt 1232:Crossing River OpenJudge NOI 4.6 702:Crossing River 一本通里的翻译不够完整,OpenJudge中的英文原题中有对数据 ...
- 信息学奥赛一本通 1194:移动路线 | OpenJudge NOI 2.6 2718:移动路线
[题目链接] ybt 1194:移动路线 OpenJudge NOI 2.6 2718:移动路线 [题目考点] 1. 坐标型动态规划 [解题思路] 解法1:递推 设状态数组dp,dp[i][j]表示从 ...
- 信息学奥赛一本通 1193:吃糖果 | OpenJudge NOI 2.6 1944:吃糖果
[题目链接] OpenJudge NOI 2.6 1944:吃糖果 注:ybt 1193:吃糖果 页面打不开,可以在OpenJudge做该题. [题目考点] 1. 递推/递归 2. 搜索 [解题思路] ...
- 信息学奥赛一本通 1191:流感传染 | OpenJudge NOI 2.3 6262:流感传染
[题目链接] ybt 1191:流感传染 OpenJudge NOI 2.3 6262:流感传染 [题目考点] 1. 二维数组 2. 队列 [解题思路] 用一个字符型二维数组存储各个房间的情况. 1. ...
- 信息学奥赛一本通 1185:单词排序 | OpenJudge NOI 1.10 10:单词排序
[题目链接] ybt 1185:单词排序 OpenJudge NOI 1.10 10:单词排序 [题目考点] 1. 排序 [君义精讲]排序算法 2. 字符串比较 字符数组比较: char s1[N], ...
- 信息学奥赛一本通 1182:合影效果 | OpenJudge NOI 1.10 07:合影效果
[题目链接] ybt 1182:合影效果 OpenJudge NOI 1.10 07:合影效果 [题目考点] 1. 排序 [君义精讲]排序算法 [解题思路] 解法1:将男生身高和女生身高分别排序 将男 ...
最新文章
- 用createrepo配置Yum本地源
- 公司--页面调用日期控件 WdatePicker日历控件使用方法
- 初看jQuery,比较dojo与jQuery的不同点
- 改变层级_3DMAX基础,可编辑多边形层级介绍及概念
- python sys.argv[]用法
- 精华阅读第6期|程序猿的世界,你不懂!
- SSM环境+jquery+ajax 实现批量文件上传并预览后,同时上传文件和数据 校验图片后缀是否合法 文件大小是否超限
- 【工具】国密SM4算法加解密
- Java线程之线程的五种状态
- html5 qq看点,AlloyTouch实战--60行代码搞定QQ看点资料卡
- 初学者C语言练习题-指针
- VC++中COM开发理论知识
- win10搜索计算机中所有excel,win10系统无法搜索到word、excel等文件内容的处理技巧...
- wnmp(wordpress环境程序windows+Nginx+PHP7.2)
- 弘辽科技:直通车双重优化
- 高数教材班复习Hint(1.1-1.7)
- Windows常见DOS命令
- Wi-Fi (-6) 知识点整理
- html的样式下拉框的联动,Web框架Ajax实现html下拉框联动
- 专业音视频播放器:Elmedia Video Player Pro mac中文版