一道水题做了好长时间,不好好审题不写注释害死人!
k排队伍写着写着就当每排有k个人了......
具体做法有注解。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
vector<pair<int, string> >a(n);
for (int i = 0; i < n; i++) {
cin >> a[i].second >> a[i].first;
}
sort(a.begin(), a.end(), [](const pair<int, string>& t1, const pair<int, string>& t2) {//按题意排序
if (t1.first != t2.first)
return t1.first > t2.first;
return t1.second < t2.second;
});
vector<vector<string> >v;
int m = n / k, cnt = 0;
for (int i = 1; i <= k; i++) //k排人
{
vector<string>b; b.push_back("0");
for (int j = 1; j <= m; j++) { //每排有n/k个人
b.push_back(a[cnt++].second);
}
if (i == 1) { //最先输出排站着额外的人
for (int j = 0; j < n % k; j++) {
b.push_back(a[cnt++].second);
}
}
v.push_back(b);
}
for (int i = 0; i < k; i++) //k排人
{
int c = v[i].size() - 1, s = c / 2 + 1, l = s - 1, r = s + 1, ind = 1;
vector<string>q(c + 1);
q[s] = v[i][ind++];
while (ind <= c) {
if (l >= 1) { //先站左边
q[l--] = v[i][ind++];
}
if (r <= c) { //后站右边
q[r++] = v[i][ind++];
}
}
for (int j = 1; j <= c; j++) {//输出
cout << q[j];
if (j != c) cout << ' ';
else cout << '\n';
}
}
return 0;
}