PAT乙級1055題解

2021-10-21 07:16:00 字數 1662 閱讀 3702

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