1055 集体照

根据题目给的信息,倒着来看,在草稿纸上试试,总的来说,有点麻烦。

#include<iostream>
#include<algorithm>
using namespace std;

struct Student {
    string name;
    int height;
} stu[10010];

string ans[10010];
int num = 0; 
bool cmp(const Student& a,const Student& b) {
    if(a.height != b.height) return a.height > b.height;
    else return a.name < b.name;
}

void func(int n) {
    int m = n/2;//最高者放中间
    ans[m] = stu[num++].name;
    int left = m-1,right = m+1;
    for(int i = 0; i < n-1; ++i) { //对剩余 n-1 个人 排列
        if(i%2 == 0)
            ans[left--] = stu[num++].name;//先放左边 
        else
            ans[right++] = stu[num++].name;//后放右边 
    }
    for(int i = 0; i < n; ++i) {//输出当前排的学生姓名
        if(i > 0) printf(" ");
        cout<<ans[i];
    }
    printf("\n");
}
int main() {
    int N,K,n;
    cin>>N>>K;
    for(int i = 0; i < N; ++i)
        cin>>stu[i].name>>stu[i].height;
    sort(stu,stu+N,cmp);
    if(N%K != 0) { //多出来的人全部站在最后一排
        n = N/K+N%K;//最后一排 n 个人
        func(n);
    }
    while(num < N){ 
        func(N/K);//输出每一排 
    }
    return 0;
}

 

posted @ 2020-02-22 16:40  tangq123  阅读(114)  评论(0)    收藏  举报