1055 集體照 (25 分)
拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下:
每排人數為 n/k(向下取整),多出來的人全部站在最後一排;後排所有人的個子都不比前排任何人矮;每排中最高者站中間(中間位置為 m/2+1,其中 m 為該排人數,除法向下取整);每排其他人以中間人為軸,按身高非增序,先右後左交替入隊站在中間人的兩側(例如5人身高為190、188、186、175、170,則隊形為175、188、190、186、170。這裡假設你面對拍照者,所以你的左邊是中間人的右邊);
若多人身高相同,則按名字的字典序公升序排列。這裡保證無重名。
現給定一組拍照人,請編寫程式輸出他們的隊形。
輸入格式:
每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 n(≤10
4 ,總人數)和 k(≤10,總排數)。隨後 n 行,每行給出乙個人的名字(不包含空格、長度不超過 8 個英文本母)和身高([30, 300] 區間內的整數)。
輸出格式:
輸出拍照的隊形。即k排人名,其間以空格分隔,行末不得有多餘空格。注意:假設你面對拍照者,後排的人輸出在上方,前排輸出在下方。
輸入樣例:
10
3tom 188
mike 170
eva 168
tim 160
joe 190
ann 168
bob 175
nick 186
amy 160
john 159
輸出樣例:
bob tom joe nick
ann mike eva
tim amy john
先定義乙個結構體,儲存人名和身高。
讀取資料存入陣列,根據身高進行排序(身高相同按人名字典序)。
由於是面對著隊伍,所以先輸出最後一排,最後一排的人數應為其他一排的人數加上剩餘的人數即 m = n / k + n % k, 其他排的人數為m = n / k,每排中間的人位置為mid = m / 2 + 1,對於每一排,我們定義乙個vector按排隊規則儲存該排的人名。
由於要交替進行排列,我們可以設立乙個flag,初始化為1,先將中間位置的人名存入vector,再迴圈存入該排的其他人名,若flag為1存右邊,存完之後將flag賦值為0,若flag為0存左邊,存完後將flag賦值為1,直到該排儲存完畢。
輸出vecter
#include
#include
#include
#include
using
namespace std;
struct peo
;bool
cmp(peo p1, peo p2)
;int
main()
sort
(a, a + n, cmp)
;for
(int i =
0; i < k; i++
)else
}for
(int j =
0; j < m; j++
) cout << endl;
}return0;
}bool
cmp(peo p1, peo p2)
PAT乙級題解
1001 害死人不償命的 3n 1 猜想 15 分 1002 寫出這個數 20 分 1003 我要通過!20 分 1004 成績排名 20 分 1005 繼續 3n 1 猜想 25 分 1006 換個格式輸出整數 15 分 1007 素數對猜想 20 分 1008 陣列元素迴圈右移問題 20 分 1...
PAT乙級題解目錄
這篇文章記錄了我做的pat乙級的題目,包含了一些心得和做題方法,在 前和注釋中均有體現。乙級目前已完成95 95,因為部分 還沒優化到最佳,所以還沒有貼上來,會陸續更新全的。leetcode個人主頁 編號 標題題解 分類備註 1001 害死人不償命的 3n 1 猜想 c 數學 1002 寫出這個數 ...
PAT乙級 題解目錄
題目 考察知識 知識補充 1001 害死人不償命的 3n 1 猜想 15分 短路運算 1002 寫出這個數 20分 字串編譯器版本 1003 我要通過!20分 推理能力 1004 成績排名 20分 三目運算子 1005 繼續 3n 1 猜想 25分 1006 換個格式輸出整數 15分 1007 素數...