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

 

 

小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
#include
#include
using namespace std;
int n,a[100010];
int main()
{
	cin>>n;
	for(int i=0;i>a[i];
	}
	sort(a,a+n);
	int l=0,r=n-1;
	double temp1=a[r];
	double temp2=a[l];
	l++;
	while(ltemp1)
		{
			double temp=(temp1+temp2)/2.0;
			temp1=temp;
			temp2=temp;
			temp1+=a[--r];
		}
		l++;
	}
	printf("%.1f",temp2);
}


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

 

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

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

你可能感兴趣的:(难堪大用)