1. 程式人生 > >有關排序的貪心策略的一種證明思想

有關排序的貪心策略的一種證明思想

spa 復制 sam 因此 思想 一個 strong badge 證明

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不重復

當ti重復時,按照輸入順序即可(sort是可以的)

分析:

思考一下可以發現應該按升序輸出。

可以通過比較相鄰兩項交換前後的總開銷變化來證明。

序列1:a1,a2,a3,a4....an

序列2:a1,a3,a2,a4...an

a1,a4...an的等待時間都不變。a2的等待時間多了a3,a3的等待時間少了a2,總時間變化為a3-a2.

當a3>a2時,交換後總時間變多了,因此不應該交換,故應該將序列升序排列。

有關排序的貪心策略的一種證明思想