1. 程式人生 > 其它 >洛谷P1223 排隊接水(水題)

洛谷P1223 排隊接水(水題)

首先要想讓排隊的時間最少需要讓用時最短的人先接水,以此類推,這樣才能保證在最大程度上節省時間;

這道題應該注意兩個問題:第一個問題是用一個變數來記錄排隊的位置

第二個問題是核心問題,排隊的平均等待時間;

要想求平均時間就要求總時間?那總時間又是什麼呢?

很多人會想:排隊的總時間不就是所有的時間加起來嗎?實則不然,因為這裡的時間是每個人等待的時間

舉個例子來說:

甲乙丙丁戊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()
{
    int
n; 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; }