傳送門
https://pintia.cn/problem-sets/994805260223102976/problems/994805272021680128
題目
拍集體照時隊形很重要,這里對給定的N個人K排的隊形設(shè)計排隊規(guī)則如下:
- 每排人數(shù)為N/K(向下取整),多出來的人全部站在最后一排;
- 后排所有人的個子都不比前排任何人矮;
- 每排中最高者站中間(中間位置為m/2+1碗脊,其中m為該排人數(shù),除法向下取整);
- 每排其他人以中間人為軸顾画,按身高非增序,先右后左交替入隊站在中間人的兩側(cè)(例如5人身高為190匆笤、188研侣、186、175炮捧、170庶诡,則隊形為175、188咆课、190末誓、186、170书蚪。這里假設(shè)你面對拍照者喇澡,所以你的左邊是中間人的右邊);
- 若多人身高相同善炫,則按名字的字典序升序排列撩幽。這里保證無重名。
現(xiàn)給定一組拍照人箩艺,請編寫程序輸出他們的隊形窜醉。
輸入格式:
每個輸入包含1個測試用例。每個測試用例第1行給出兩個正整數(shù)N(<=10000艺谆,總?cè)藬?shù))和K(<=10榨惰,總排數(shù))。隨后N行静汤,每行給出一個人的名字(不包含空格琅催、長度不超過8個英文字母)和身高([30, 300]區(qū)間內(nèi)的整數(shù))居凶。
輸出格式:
輸出拍照的隊形。即K排人名藤抡,其間以空格分隔侠碧,行末不得有多余空格。注意:假設(shè)你面對拍照者缠黍,后排的人輸出在上方弄兜,前排輸出在下方。
輸入樣例:
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
分析
1.首先建個結(jié)構(gòu)體數(shù)組存數(shù)據(jù)瓷式;
2.然后用sort排序(先按身高排序替饿,若身高相等,按字母排序)贸典;
3.按照先中間视卢,再左邊,再右邊的順序往將要輸出的字符串里面存人名廊驼,要加上空格据过,每存滿一列的人名后就輸出結(jié)果。
遇到的坑:
1.按字母排序的時候蔬充,我只比較了第一位的字母蝶俱, 只通過了前三個測試點,顯然測試數(shù)據(jù)想的比較全饥漫,于是榨呆,換成直接利用字符串比大小就行了;
2.題目中說排隊的邏輯也是倒著說的:“每排的身高非增序庸队、字母序升序”积蜻,由于我也要從最后一排倒著輸出,所以排序肯定與題目要求是一致的而不是相反的彻消,這里不要搞錯了竿拆,所以是身高降序,字母序升序宾尚。
源代碼
//C/C++實現(xiàn)
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct student{
string name;
int height;
};
bool compare(struct student a, struct student b){
if(a.height != b.height){
return a.height > b.height;
}
else{
return a.name < b.name;
}
}
int main(){
int n, k;
scanf("%d %d", &n, &k);
vector<struct student> v(n);
for(int i = 0; i < n; ++i){
cin >> v[i].name >> v[i].height;
}
sort(v.begin(), v.end(), compare);
int col = n / k; //其他排的人數(shù)
int final = n / k + (n % k); //最后一排人數(shù)
string result = "";
for(int i = 0; i < n; ){
if(i == 0){ //先站最后一排
result = v[i].name;
++i;
for(int j = 1; j < final; ++j, ++i){
if(j % 2 == 1){
result = v[i].name + " " + result;
}
else{
result = result + " " + v[i].name;
}
}
cout << result << endl;
}
else{
result = v[i].name;
++i;
for(int j = 1; j < col; ++j, ++i){
if(j % 2 == 1){
result = v[i].name + " " + result;
}
else{
result = result + " " + v[i].name;
}
}
cout << result << endl;
}
}
}