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 素數...