難度:普及-
題目型別:貪心
提交次數:1
涉及知識:貪心,排序
有n個人在乙個水龍頭前排隊接水,假如每個人接水的時間為ti,請程式設計找出這n個人排隊的一種順序,使得n個人的平均等待時間最小。
輸入格式:
輸入檔案共兩行,第一行為n;第二行分別表示第1個人到第n個人每人的接水時間t1,t2,…,tn,每個資料之間有1個空格。
輸出格式:
輸出檔案有兩行,第一行為一種排隊順序,即1到n的一種排列;第二行為這種排列方案下的平均等待時間(輸出結果精確到小數點後兩位)。
**:
1 #include2 #include3 #include4 #include5using
namespace
std;
6struct
stu10
};11 vectorv;
12bool
com(stu a, stu b)
15int
main()
24sort(v.begin(), v.end(), com);
25for(i = 0; i < v.size(); i++)
26 cout<"";
27 cout<28float sum = 0;29
for(i = 0; i < v.size(); i++)
30 sum += v[i].w*(n-i-1
);31
/*map::iterator iter;
32for(iter = a.begin(); iter != a.end(); iter++)
33*/
36 printf("%f"
, sum);
37double ans;38 ans = sum/n;
39 printf("
%.2lf
", ans);
40return0;
41 }
備註:
很簡單的一道題,貪心選擇策略就是時間越短的人越往前排,本來想藉機熟悉一下map。不過實在多此一舉了。。注釋部分作參考吧。
不過這道題幫我彌補了乙個很大的知識點漏洞,即單精度和雙精度問題。我開始時用的float,結果會有很小的誤差,改成double就對了。上網查資料,發現階碼啊,尾碼啊,指數字都不記得了。就複習了一下。以下內容摘自部落格。
(浮點)數值 = 尾數 × 底數 ^ 指數,(附加正負號)---------------- f.2
於是,float的指數範圍為-127~128,而double的指數範圍為-1023~1024,並且指數字是按補碼的形式來劃分的。其中負指數決定了浮點數所能表達的絕對值最小的數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。
float的範圍為-2^128 ~ +2^128,也即-3.40e+38 ~ +3.40e+38;double的範圍為-2^1024 ~ +2^1024,也即-1.79e+308 ~ +1.79e+308。
float和double的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是乙個隱含著的「1」,由於它是不變的,故不能對精度造成影響。
float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
是有效數字,不是小數點後幾位,這塊我一直搞錯了。。。float能保證精度的只有6位有效數字,所以整數部分稍大一些就掛了。
P1223 排隊接水
題目描述 有n個人在乙個水龍頭前排隊接水,假如每個人接水的時間為ti,請程式設計找出這n個人排隊的一種順序,使得n個人的平均等待時間最小。輸入輸出格式 輸入格式 輸入檔案共兩行,第一行為n 第二行分別表示第1個人到第n個人每人的接水時間t1,t2,tn,每個資料之間有1個空格。輸出格式 輸出檔案有兩...
P1223 排隊接水
有 n 個人在乙個水龍頭前排隊接水,假如每個人接水的時間為 t it i ti 請程式設計找出這 n 個人排隊的一種順序,使得 n 個人的平均等待時間最小。輸入格式 第一行為乙個整數 n。第二行 n 個整數,第 i 個整數 t it i ti 表示第 i 個人的等待時間 t it i ti 輸出格式...
P1223 排隊接水 題解
這個題是標準的貪心題目,只要保證按照耗費時間從小往大排列就可保證整個序列等待時間最短。但是還是有一些問題需要注意 1 第乙個最後的結果如果用float會溢位,爆掉五個點。2 二維陣列的sort排序 include include using namespace std int a newint 10...