1. 程式人生 > >luogu P1223 排隊接水 x

luogu P1223 排隊接水 x

個數 isp color opened 結果 ble view struct ret

P1223 排隊接水

題目描述

有n個人在一個水龍頭前排隊接水,假如每個人接水的時間為Ti,請編程找出這n個人排隊的一種順序,使得n個人的平均等待時間最小。

輸入輸出格式

輸入格式:

輸入文件共兩行,第一行為n;第二行分別表示第1個人到第n個人每人的接水時間T1,T2,…,Tn,每個數據之間有1個空格。

輸出格式:

輸出文件有兩行,第一行為一種排隊順序,即1到n的一種排列;第二行為這種排列方案下的平均等待時間(輸出結果精確到小數點後兩位)。

輸入輸出樣例

輸入樣例#1:
10 
56 12 1 99 1000 234 33 55 99 812
輸出樣例#1:
3 2 7 8 1 4 9 6 10 5
291.90

說明

n<=1000

ti<=1e6,不保證ti不重復

思路:

  貪心:先讓花時間最少的人先接水,這樣等的時間是最少的(不懂的話可以手動模擬一下~)

  但是因為最後還要輸出方案,所以需要開結構體,讓編號跟著時間一起進行快排

坑點:

  千萬不要忘記輸出方案!(本來想用map做排序的我發現根本不會用map,蒟蒻瑟瑟發抖...)

  如果不會用結構體的話,還可以用兩個數組來做,一個記錄編號,一個記錄時間,然後手寫排列,兩個一起進行排序.

代碼:

技術分享
#include <iostream>
#include 
<cstdio> #include <algorithm> #include <map> #define LL long long using namespace std; const int M = 1008; int n; double ans; struct A{ int z,num; bool operator < (const A &qwq)const { return z < qwq.z; } }t[M]; void Dengren(int
times,int persons) { ans+=(double)times*persons; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&t[i].z),t[i].num=i; sort(t+1,t+1+n);///從小到大 for(int i=1;i<=n;i++) { printf("%lld ",t[i].num); Dengren(t[i].z,n-i); } printf("\n"); ans/=n;///因為最後輸出的是平均等待時間 printf("%.2lf",ans); return 0; }
View Code

luogu P1223 排隊接水 x