此题,可惜了~
附上原题:
小S新买了一个掌上游戏机,这个游戏机由两节5号电池供电。为了保证能够长时间玩游戏,他买了很多5号电池,这些电池的生产商不同,质量也有差异,因而使用寿命也有所不同,有的能使用5个小时,有的可能就只能使用3个小时。显然如果他只有两个电池一个能用5小时一个能用3小时,那么他只能玩3个小时的游戏,有一个电池剩下的电量无法使用,但是如果他有更多的电池,就可以更加充分地利用它们,比如他有三个电池分别能用3、3、5小时,他可以先使用两节能用3个小时的电池,使用半个小时后再把其中一个换成能使用5个小时的电池,两个半小时后再把剩下的一节电池换成刚才换下的电池(那个电池还能用2.5个小时),这样总共就可以使用5.5个小时,没有一点浪费。
现在已知电池的数量和电池能够使用的时间,请你找一种方案使得使用时间尽可能的长。
首先,先关注一下最长的加黑字。这段字就是在暗示我们,同部分背包问题中,物品可分割的情况一样,多余的电池也可以“分割”(但是是有条件的!!!会在代码中讲解),其次,“可能”就表明,电池的寿命并不是只有3或者5,还可能是非常大的,或是非常小的,总之是不固定的!!!
先看下代码:
#include
#include
using namespace std;
double a[1005];
int main()
{
int n;
int i,j;
double sum,ma; //sum,记录所有电池的总时长,ma记录电池中寿命最长的那个(为什么?下面会说)
while(~scanf("%d",&n))
{
for(i=0;i<=n-1;i++)
{
scanf("%lf",&a[i]);
if(i==0)
{
ma=a[i];
sum=a[i];
}
else
{
sum=sum+a[i];
ma=max(ma,a[i]);
}
}
// printf("%lf %lf\n",sum,ma);
if(ma>sum-ma) //这个就是电池“分割”的条件了,如果最大的那个比其余所有电池的寿命之和还大,则不可以对大的分割(比如,3,5或者100,33,33,33)
printf("%.1lf\n",sum-ma); //因此,此时最大用时为其余电池寿命之和
else
printf("%.1lf\n",sum/2.0); //否则,则将总数除以2就好了(因为电池要成对使用,此时每个电池都可以“分割”)
}
return 0;
}
小结:注意背包问题“分割”的条件。