1229:電池的壽命
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 3681 通過數: 2051
【題目描述】
小S新買了一個掌上游戲機,這個游戲機由兩節5號電池供電。為了保證能夠長時間玩游戲,他買了很多5號電池,這些電池的生產商不同,質量也有差異,因而使用壽命也有所不同,有的能使用5個小時,有的可能就只能使用3個小時。顯然如果他只有兩個電池一個能用5小時一個能用3小時,那么他只能玩3個小時的游戲,有一個電池剩下的電量無法使用,但是如果他有更多的電池,就可以更加充分地利用它們,比如他有三個電池分別能用3、3、5小時,他可以先使用兩節能用3個小時的電池,使用半個小時后再把其中一個換成能使用5個小時的電池,兩個半小時后再把剩下的一節電池換成剛才換下的電池(那個電池還能用2.5個小時),這樣總共就可以使用5.5個小時,沒有一點浪費。
現在已知電池的數量和電池能夠使用的時間,請你找一種方案使得使用時間盡可能的長。
【輸入】
輸入包含多組數據。每組數據包括兩行,第一行是一個整數N(2≤N≤1000),表示電池的數目,接下來一行是N個正整數表示電池能使用的時間。
【輸出】
對每組數據輸出一行,表示電池能使用的時間,保留到小數點后1位。
代碼
#include<iostream> #include<cstdio> #include<math.h> #include<algorithm> #include<cstring> using namespace std; int main(void) { int n,sum=0; int a[1001]; while(cin>>n) { memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { if(a[i]<=a[j]) { swap(a[i],a[j]); } } } for(int i=2;i<=n;i++) { sum+=a[i]; } if(sum<=a[1]) { double num=sum; printf("%.1lf\n",num); } else { sum=0; for(int i=1;i<=n;i++) { sum+=a[i]; } } double ans=sum/2.0; printf("%.1lf\n",ans); } return 0; }
這道題實際上只有兩種情況:一是當最大電池的使用壽命大於其他電池的使用壽命之和sum時,最大時長為sum;
二是當最大電池的使用壽命小於其他電池的使用壽命之和sum時,最大時長為sum/2;
第二種情況的討論就要運用到貪心思想。
在條件二中,若要達到最優的結果,那么在使用電池時就要避免出現第一種情況,而且也不能讓剩下的電池的剩余使用時間過長,那么每次都在總電池中選擇
剩余電量最多的兩節電池使用,那么在不斷的操作之后,設電池電量為a[n],a[n-1].a[n-2],a[n-3],a[n-4]....a[1]
那么在使用后應變為a[n]-1,a[n-1]-1,a[n-2]-1,...,a[1]-1
那么不斷操作后電池的電量仍有剩余,為(1,1)或(1,1,1),必然能夠用完,故一共有兩種必然可能的情況
1.最大電池的使用壽命大於其他電池的使用壽命之和時,答案為除了壽命最長的電池之外的其他所有電池的壽命之和。
2.最大電池的使用壽命小於等於其他電池的使用壽命之和時,答案為總電池壽命的一半
針對這兩個條件,設置判斷求解即可