- PAT 甲级 刷题日记|A 1109 Group Photo (
- PAT A1001 A+B Format (20)
- PAT 甲级 刷题日记|A 1122 Hamiltonian
- PAT 甲级 刷题日记|A 1123 Is It a Compl
- PAT 甲级 刷题日记|A 1038 Recover the
- PAT 甲级 刷题日记|A 1043 Is It a Bina
- PAT 甲级 刷题日记|A 1129 Recommendatio
- PAT 甲级 刷题日记|A 1127 ZigZagging on
- PAT 甲级 刷题日记|A 1094 The Largest
- PAT 甲级 刷题日记|A 1135 Is It A Red
思路
涉及到排序 + 模拟。这边我不是单纯的模拟左一个右一个的放置,而是找到每一个位置应该是第几高,按顺序填进去,比单纯的模拟在代码实现上要简单许多。
代码
using namespace std;
const int maxn = 10003;
int N, K;
int num[maxn];
int group[maxn];
struct node {
string name;
int hei;
}Node[maxn];
bool cmp(node a, node b) {
if (a.hei != b.hei) return a.hei > b.hei;
else return a.name < b.name;
}
int main() {
cin>>N>>K;
for (int i = 0; i < N; i++) {
cin>>Node[i].name>>Node[i].hei;
}
sort(Node, Node + N, cmp);
int ans = 0;
for (int i = 0; i < K; i++) {
if (i != K - 1) {
num[i] = N / K;
ans += num[i];
} else {
num[i] = N - ans;
}
}
int indexs = 0;
for (int i = K - 1; i >= 0; i--) {
for (int j = 0; j < num[i]; j++) {
int now = j - (num[i] / 2);
if (now < 0) group[i + j] = 2 * abs(now) - 1 + indexs;
else group[i + j] = 2 * abs(now) + indexs;
cout<<Node[group[i+j]].name;
if (j != num[i] - 1) cout<<" ";
}
indexs += num[i];
cout<<endl;
}
}
网友评论