原poj 3468 电池的寿命(现在 不知道是哪个题了)贪心

来源:互联网 发布:windows vista 编辑:程序博客网 时间:2024/04/28 09:38

小S新买了一个掌上游戏机,这个游戏机由两节5号电池供电。为了保证能够长时间玩游戏,他买了很多5号电池,这些电池的生产商不同,质量也有差异,因而使用寿命也有所不同,有的能使用5个小时,有的可能就只能使用3个小时。显然如果他只有两个电池一个能用5小时一个能用3小时,那么他只能玩3个小时的游戏,有一个电池剩下的电量无法使用,但是如果他有更多的电池,就可以更加充分地利用它们,比如他有三个电池分别能用3、3、5小时,他可以先使用两节能用3个小时的电池,使用半个小时后再把其中一个换成能使用5个小时的电池,两个半小时后再把剩下的一节电池换成刚才换下的电池(那个电池还能用2.5个小时),这样总共就可以使用5.5个小时,没有一点浪费。

现在已知电池的数量和电池能够使用的时间,请你找一种方案使得使用时间尽可能的长。

输入 
输入包含多组数据。每组数据包括两行,第一行是一个整数N (2 ≤ N ≤ 1000),表示电池的数目,接下来一行是N个正整数表示电池能使用的时间。

输出 
对每组数据输出一行,表示电池能使用的时间,保留到小数点后1位。

样例输入 

3 5 

3 3 5 
样例输出 
3.0 
5.5

我是在考NOIP前看的这个题,考完回来现在又看了一遍,最初看到这个题感到很萌币也,什么鬼题,找不到判断条件,不会是找最小,最大,两个电池找最小,三个电池直接和/2.0(第一眼的结论 肯定是错的),更不可能是 和/2.0(可能会有这个点)然后我就把这个题放下了 在这回看到这个题时有考虑了一番,发现并不是很难,接下来说说我的想法;

首先进行一遍排序,记录最大值,从最小值累加直到大于最大值 或是累加到最大值前,若是大于了,就两个数加起来除二返回成这两个数的值,之后再使一个数加上次大值,再进行以上的操作,直到整个数组(存储电池的寿命)被利用完,输出两个数的最小值就OK;

但是后来看了看正解 发现我的解还是有毛病的 因为我没找到地方可以测,我也不知道能卡多少分,

贴上我的代码(有可能一个点也不过)

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int n,a[100010];int main(){cin>>n;for(int i=0;i<n;i++){cin>>a[i];}sort(a,a+n);int l=0,r=n-1;double temp1=a[r];double temp2=a[l];l++;while(l<r){temp2+=a[l];if(temp2>temp1){double temp=(temp1+temp2)/2.0;temp1=temp;temp2=temp;temp1+=a[--r];}l++;}printf("%.1f",temp2);}

在找这个题目的网上在线评测时,我也看了看某些大佬的博客中对这个题的讲解,真是比我的好很多倍,接下来,我来转述一下真正的正解

首先,还是先排个序(也可以不用,在输入时直接进行以下操作),记录最大值和总和,若是最大值大于总和一半,输出总和- 最大值就行,否则直接输出总和/2.0;

至于这个方法的代码实现 相信就不用贴代码了吧

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 自粘墙纸撕不掉怎么办 打雷了怎么办主题画 打雷了怎么办小班教案 费雪小火车不走怎么办 宝宝睡觉要开灯怎么办 门上有人做记号怎么办 颜料粘上衣服洗不掉怎么办 半夜有小偷开锁怎么办 幼儿园人数较多怎么办 附近幼儿园拖班招满了怎么办 6个月大宝宝拉肚子怎么办 婴儿容易吐奶怎么办 新生儿睡眠时间颠倒怎么办 婴儿睡觉黑白颠倒怎么办 婴儿黑白颠倒了怎么办 宝宝肠粘膜受损怎么办 dnf会卡换装怎么办? 孩子不讲理蛮横怎么办 孩子不爱上学了怎么办 幼儿园孩子不爱上学怎么办 额头撞肿了怎么办 两岁半宝宝说话晚怎么办 1岁宝宝拉肚子怎么办? 小孩嗓子老哑怎么办 小孩嗓子经常哑怎么办 小孩子一年级成绩差怎么办 小孩子一年级学习成绩差怎么办 楼上有孩子扰民怎么办 隔壁小孩太吵怎么办 楼上孩子太吵怎么办 泰国贴纸签小孩怎么办 六个月宝宝近视怎么办 孩子视力低应该怎么办 儿童视力低常怎么办 视力储备值低怎么办 六个月宝宝远视怎么办 婴儿喜欢舔衣服怎么办 一岁半宝宝抵抗力差怎么办 两个月宝宝打嗝怎么办 衣服买大一码怎么办 8岁儿童头汗多怎么办