1055 集体照

//freopen("D:\\文件夹\\Desktop\\use.txt","r",stdin);

#include 
#include 
#include 
#include 
#define MAX 10050
int pos[15][MAX];
typedef struct Student{
    char n[9];
    int h;
}Student;
Student S[MAX];
int cmp_up(const void*a,const void*b) //先身高后字典
{
    //return ( * (Student * )b).h > ( * (Student * )a).h ? 1:-1;
    if(( * (Student * )a).h != ( * (Student * )b).h)
    return ( * (Student * )b).h - ( * (Student * )a).h;
    else return strcmp(( * (Student * )a).n , ( * (Student * )b).n) >0;
}
int main()
{
    //freopen("D:\\文件夹\\Desktop\\use.txt","r",stdin);
    int N,K;scanf("%d %d\n",&N,&K);int i = 0;int NN = N;
    while(N--){scanf("%s %d\n",S[i].n,&S[i].h);i++;}
    qsort(S,NN,sizeof(S[0]),cmp_up);//排序
    int p = 1;//辅助定位
    int pp = 0;//从0开始放
    for(int i = 0;i < K;++i){ //行
        p = 1;
        int m = (i == 0?NN/K + NN%K : NN/K); //行内个数
        pos[i][m/2] = pp;pp++;
        int j = 1;
        while(j < m){
            pos[i][m/2 - p] = pp;pp++;j++;
            if(j < m) {pos[i][m/2 + p] = pp;pp++;j++;}
            p++;
        }
    }
    for(int i = 0;i < K ;++i){
        int m = (i == 0?NN/K + NN%K : NN/K); //行内个数
        for(int j = 0;j < m;++j){
            j == m-1 ? printf("%s",S[pos[i][j]].n):printf("%s ",S[pos[i][j]].n);
        }
        if(i != K-1) printf("\n");
    }
    return 0;
 }

思考过程
175 188 190 186
168 170 168
160 160 159
pos内:
3 1 0 2
5 4 6
8 7 9
姓名:
Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John
个数确定:
10/3 = 3行
10/4 = 2 ..2 4行 第一行4个人 第二行2 第三行2 第四行2

你可能感兴趣的:(1055 集体照)