题目翻译:
拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下:
1、每排人数为N/K(向下取整),多出来的人全部站在后一排;
2、后排所有人的个子都不比前排任何人矮;
3、每排中高者站中间(中间位置为m/2+1,其中m为该排人数,除法向下取整);每排其他人以 间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、 175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);若多人身高相同,则按名字的字典序升序排列。
题解思路:
先求出每排的人数,然后对整体排序,接着使用双端队列deque分别打印每排的序列
代码:
#include<bits/stdc++.h>
using namespace std;
int N, K;
vector<pair<string, int>> p;
bool comp(pair<string, int> q1, pair<string, int> q2)
{
if (q1.second > q2.second)
return true;
else if (q1.second == q2.second)
return q1.first < q2.first;
else
return false;
}
void display(int index, int num)//下标,该行人数
{
deque<string> D;
D.push_back(p[index++].first);
int count = 1;
while (count < num)
{
if (count % 2)//奇数
D.push_front(p[index].first);
else
D.push_back(p[index].first);
index++;count++;
}
for (int i = 0;i < D.size();i++)
{
if (i)
cout << " ";
cout << D[i];
}
cout << endl;
}
int main()
{
cin >> N >> K;
for(int i=0;i<N;i++)
{
string name;
int height;
cin >> name >> height;
p.push_back(make_pair(name, height));
}
sort(p.begin(), p.end(), comp);
int count = N / K, last = N % K + count;//除了最后一排的人数,最后一排的人数
for (int i = 0;i < K;i++)
{
if (i == 0)
display(i, last);
else
display(last + (i - 1) * count, count);
}
}
坑点:
无