0%

电池的寿命

题面

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

输入

1
2
3
4
2
3 5
3
3 3 5

输出

1
2
3.0
5.5

思路

从大到小排序 分成两组 如果n>2 答案就是和的一半(如果两组各自的和一样,不必多说,不一样肯等是电池多的总和多,内部消化就行了消化完就变成了组各自的和一样了) 否则就是最小的。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1010;

int n;
double a[N];

int main()
{

while (cin >> n) {

double sum = 0;
double sum1 = 0, sum2 = 0;
int cnt1 = 0, cnt2 = 0;

for (int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
}

double ans = sum / 2;

sort(a, a + n);

for (int i = n - 1; i >= 0; i--)
{
if (sum1 > ans) {
sum1 -= a[i + 1];
cnt1--;
break;
}
sum1 += a[i];
cnt1++;

}

sum2 = sum - sum1;
cnt2 = n - cnt1;

double c = sum2 - sum1;
if(n==2) printf("%.1f\n", a[0]);
else printf("%.1f\n", ans);

}

return 0;


}
-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道