信息学奥赛一本通 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\fracze8trgl8bvbq{2}2d?,共消耗時長ddd。由于d2≤d≤ae≤am\fracze8trgl8bvbq{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:电池的寿命的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牧马人鼠标g13鼠标宏_达尔优EM910
- 下一篇: mysql5.1.7升级到5.6_1 M