【NOI】2469:電池的壽命/ 4.6演算法之貪心
阿新 • • 發佈:2019-01-06
傳送門:檢視
2469:電池的壽命
總時間限制:
1000ms
記憶體限制:
65536kB
描述
小S新買了一個掌上游戲機,這個遊戲機由兩節5號電池供電。為了保證能夠長時間玩遊戲,他買了很多5號電池,這些電池的生產商不同,質量也有差異,因而使用壽命也有所不同,有的能使用5個小時,有的可能就只能使用3個小時。顯然如果他只有兩個電池一個能用5小時一個能用3小時,那麼他只能玩3個小時的遊戲,有一個電池剩下的電量無法使用,但是如果他有更多的電池,就可以更加充分地利用它們,比如他有三個電池分別能用3、3、5小時,他可以先使用兩節能用3個小時的電池,使用半個小時後再把其中一個換成能使用5個小時的電池,兩個半小時後再把剩下的一節電池換成剛才換下的電池(那個電池還能用2.5個小時),這樣總共就可以使用5.5個小時,沒有一點浪費。
現在已知電池的數量和電池能夠使用的時間,請你找一種方案使得使用時間儘可能的長。
輸入
輸入包含多組資料。每組資料包括兩行,第一行是一個整數N (2 ≤ N ≤ 1000),表示電池的數目,接下來一行是N個正整數表示電池能使用的時間。
輸出
對每組資料輸出一行,表示電池能使用的時間,保留到小數點後1位。
樣例輸入
2 3 5 3 3 3 5
樣例輸出
3.0 5.5
------------------------------------華麗的答案分割線------------------------------------
又是貪心,還蠻簡單,從一些栗子中可以發現規律:如果最持久的電池可以玩的時間比其他電池一共能玩的時間都長,那麼最多能玩“其他電池”一共能玩的時間那麼久,而如果最持久的電池可以玩的時間比其他電池一共能玩的時間短(或一樣久),那麼能玩的時間等於所有電池一共能玩的時間除以2那麼久,發現了這個規律,這道題就太簡單了:
#include<bits/stdc++.h> using namespace std; int main() { double n,a[10001],max=0,sum=0,summ=0; int i; while(cin>>n) { for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n;i++) if(a[i]>max) max=a[i]; for(i=1;i<=n;i++) { if(a[i]!=max) sum+=a[i]; summ+=a[i]; } if(sum<max) cout<<fixed<<setprecision(1)<<sum; else cout<<fixed<<setprecision(1)<<summ/2; cout<<endl; max=sum=summ=0; } return 0; }