python3 1055 集體照 25分

2021-08-20 14:08:55 字數 1645 閱讀 6722

題目如下:

後排所有人的個子都不比前排任何人矮;

每排中最高者站中間(中間位置為m/2+1,其中m為該排人數,除法向下取整);

每排其他人以中間人為軸,按身高非增序,先右後左交替入隊站在中間人的兩側(例如5人身高為190、188、186、175、170,則隊形為175、188、190、186、170。這裡假設你面對拍照者,所以你的左邊是中間人的右邊);

若多人身高相同,則按名字的字典序公升序排列。這裡保證無重名。

10 3

tom 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

題目解析:

首先處理輸入,名字和身高,作為乙個列表;將輸入資訊列表按要求排序;計算每行人數(最後一行不同),江每行的人放入對應的乙個列表中(person_eachrow)(按排序順序,這一步十分方便);最後處理每行的人,按要求輸出。這裡再解釋兩處:

1> 排序函式: python3沒有cmp了,只能使用key,只能傳入乙個引數的函式;對於名字string作為第二關鍵字的比較,鄙人暫時探索發現只能如下使用,不能加-號,所以只可以讓x[0]這個int加-號表示逆序;如果比較方法再複雜一些,不知如何實現。

2> 輸出控制:ret為人的拍照位置,先找到最中間的位置mid,然後依次像兩邊放置人,看**理解一下吧~

n, k = map(int,input().split())

lst =

for i in range(n):

name, height = input().split()

lst.sort(key=lambda x:(-x[0], x[1]))

n_per_row = n//k

n_lastrow = n - n_per_row * (k-1)

person_eachrow = [lst[:n_lastrow]] + [ lst[n_lastrow + n_per_row * i:n_lastrow + n_per_row * (i+1)] for i in range(k-1)]

# print(person_eachrow)

for pers in person_eachrow:

length = len(pers)

ret = ['' for i in range(length)]

mid = length//2

ret[mid] = pers[0][1]

cn = 1

for j in range(1,length,2):

if j == length - 1:

ret[mid - cn] = pers[j][1]

else:

ret[mid - cn] = pers[j][1]

ret[mid + cn] = pers[j+1][1]

cn += 1

print(" ".join(ret))

(python 3)1055 集體照 25分

1055 集體照 25分 拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下 現給定一組拍照人,請編寫程式輸出他們的隊形。每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 n 10 4 總人數 和 k 10,總排數 隨後 n 行,每行給出乙個人的名字 不包含...

1055 集體照 (25 分)

拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下 現給定一組拍照人,請編寫程式輸出他們的隊形。每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 n 10 4 總人數 和 k 10,總排數 隨後 n 行,每行給出乙個人的名字 不包含空格 長度不超過 8 個英...

1055 集體照 25 分

拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下 現給定一組拍照人,請編寫程式輸出他們的隊形。每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 n 10 4 總人數 和 k 10,總排數 隨後 n 行,每行給出乙個人的名字 不包含空格 長度不超過 8 個英...