【PAT乙级】1055 集体照

    科技2024-05-10  95

    题目链接:1055 集体照

    思路

    将输入进行排序,推荐从高到低排,我懒得改了。再创建一个用于输出的数组,按照要求将排好序的数据逐行逐位填充即可。25分的题一次AC还是蛮开心的。

    代码

    #include <iostream> #include <algorithm> using namespace std; struct person{ string name; int tall; }; int cmp(person p1,person p2){//按照身高由低向高排序 if(p1.tall == p2.tall){ for(int i=0;i<p1.name.length();i++){ if(i==p2.name.length())return 1; if(p1.name[i]>p2.name[i])return 1; if(p1.name[i]<p2.name[i])return 0; } return 0; } return p1.tall < p2.tall; } int main(){ int N,K,m,mid,count; cin >> N >> K; m = N / K + N % K;//最后一排人数 count = N; person p[N],po[K][m];//分别存储输入与输出 for(int i=0;i<N;i++) cin >> p[i].name >> p[i].tall; sort(p,p+N,cmp); for(int i=K-1;i>=0;i--){//第K行开始填充po mid = m / 2;//数组从0开始,故-1 for(int j=0;j<m;j++){ int bia = j % 2 ? -(j+1)/2 : (j+1)/2;//每轮填充相对中间的偏移 po[i][mid+bia] = p[--count]; } if(i == K-1) m -= N % K;//过了最后一行,修改每行人数 } m = N / K + N % K; for(int i=K-1;i>=0;i--){ for(int j=0;j<m;j++){ cout << po[i][j].name; if(j != m-1) cout << ' '; } cout << endl; if(i == K-1) m -= N % K; } return 0; }

     

    Processed: 0.022, SQL: 8