少し面倒なシミュレーションの質問です。ACを書くのに40分かかりました。私のアプローチは、最初に最後の行を取り出して別々に出力し、次に最初の数行の人数が同じになることです。新しい行を開くことができます。それを格納する配列。特定の実装詳細は少し面倒なので、コードを自分で見ることができます。。。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct Student{
char name[10];
int h;
};
bool cmp(Student s1, Student s2){
if(s1.h != s2.h) return s1.h > s2.h;
return strcmp(s1.name,s2.name) < 0;
}
int main(){
int n, k;
scanf("%d %d", &n, &k);
Student stu[n];
for(int i=0; i<n; i++){
scanf("%s %d", stu[i].name, &stu[i].h);
}
sort(stu, stu+n, cmp);
int lastnum = n/k + n%k;
Student temp[lastnum];
int mid = lastnum/2 + 1;
temp[mid] = stu[0];
int t = 1;
int flag = 0;
for(int i=1; i<lastnum; i++){
if(!flag){
temp[mid-t] = stu[i];
flag = 1;
}else{
temp[mid+t] = stu[i];
t++;
flag = 0;
}
}
for(int i=1; i<=lastnum; i++){
printf("%s", temp[i].name);
if(i != lastnum) printf(" ");
}
printf("\n");
int numleft = n - lastnum;
Student nstu[numleft];
for(int i=1; i<=numleft; i++){
nstu[i] = stu[lastnum++];
}
int num = n / k;
int lun = numleft / num;
for(int i=0; i<lun; i++){
Student temp[num+1];
int mid = num/2 + 1;
temp[mid] = nstu[i*num+1];
int t = 1;
int flag = 0;
for(int j=i*num+2; j<=(i+1)*num; j++){
if(!flag){
temp[mid-t] = nstu[j];
flag = 1;
}else{
temp[mid+t] = nstu[j];
t++;
flag = 0;
}
}
for(int j=1; j<=num; j++){
printf("%s", temp[j].name);
if(j != num) printf(" ");
}
printf("\n");
}
return 0;
}