洛谷P1223 排隊接水(水題)
阿新 • • 發佈:2022-02-07
首先要想讓排隊的時間最少需要讓用時最短的人先接水,以此類推,這樣才能保證在最大程度上節省時間;
這道題應該注意兩個問題:第一個問題是用一個變數來記錄排隊的位置
第二個問題是核心問題,排隊的平均等待時間;
要想求平均時間就要求總時間?那總時間又是什麼呢?
很多人會想:排隊的總時間不就是所有的時間加起來嗎?實則不然,因為這裡的時間是每個人等待的時間
舉個例子來說:
甲乙丙丁戊5個人去水房打水,分別需要2、4、7、10、13分鐘,若只有一個水龍頭,想5人打水和等待的時間之和最短,則最短時間為多少?
分析:5個人打水的總時間是不變的為2+4+7+10+13=36分鐘,而等待時間受打水者的時間限制,只有打水者時間短,才能使等待時間短。所以讓打水者速度從快到慢排隊打水,則按照甲乙丙丁戊的順序打水。甲先打2分鐘,其他四人一共等待了2×4=8分鐘,乙打水4分鐘,剩下三人打水共等待了4×3=12分鐘,丙打水7分鐘,剩下兩人打水共等待了7×2=14分鐘,丁打水10分鐘,最後一人等待10分鐘,所以合計等待時間8+12+14+10=44分鐘。則所求最短時間為36+44=80分鐘。
看明白了吧,那麼設總時間為tot,每個人的打水時間是a[0]...a[n-1],
tot=a[0]*(n-1)+.....a[n-1]*0;
平均等待時間average=tot/n(n表示總人數);
ac程式碼如下:
#include<bits/stdc++.h> using namespace std; struct node { int Time; int position;//記錄每個人的位置; }a[1010]; bool cmp(node x,node y) { return (x.Time<y.Time); } int main() { intn; cin>>n; for(int i=0;i<n;i++) { scanf("%d",&a[i].Time); a[i].position=i+1; } sort(a,a+n,cmp); double sum=0,average; int j=n-1; for(int i=0;i<n;i++) { sum+=a[i].Time*j;//核心公式:總時間=x1*(n-1)+x2*(n-2)+..... xn*0; j--; printf("%d ",a[i].position); } cout<<endl; average=sum/n; printf("%.2f",average); return 0; }