PAT A1109 Group Photo [模拟]

题目描述

链接
排方阵

  • 每一排的人高于下一排的人
  • 先递减排列,然后先排中间m/2+1,再排左边,然后排右边
  • 相同身高按照字母顺序递增

分析

  • 搞错了一件事!!就是中间的人和旁边的身高相同的话,不用按字母排
  • 二维数组排序的话,可以用一维数组排好序,再放进二维数组里面,所以!!最好用vector
  • 一定要记住,如果下标从1开始,sort的写法!!!!
  • struct里面有string的话,最好用vector,不要用maxn了!!!否则struct里面就用char

代码

#include<bits/stdc++.h>
using namespace std;


const int maxn = 1e4+10;
int a[maxn][maxn];

struct node{
    char s[30];
    int num;
}nodes[maxn];

int n,k;
bool cmp(node a, node b){
    if(a.num != b.num) return a.num > b.num;
    return strcmp(a.s, b.s) < 0;
}

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>nodes[i].s>>nodes[i].num;
    }
    sort(nodes+1,nodes+n+1,cmp);

    int j = 1;
    int m;
    for(int i=1;i<=k;i++){ //k行
        if(i==1) m = n % k + n/k;
        else m = n/k;
        a[i][m/2+1] = j++;
        int cnt = 1;
        while(cnt <= m/2){
            if(m/2+1-cnt>=1)
                a[i][m/2+1-cnt] = j++;
            if(m/2+1+cnt<=m){
                a[i][m/2+1+cnt] = j++;
            }
            cnt++;
        }
    }
    for(int i=1;i<=k;i++){
        if(i==1) m = n % k + n/k;
        else m = n/k;
        for(int j=1;j<=m;j++){
            if(j==1) cout<<nodes[a[i][j]].s;
            else cout<<" "<<nodes[a[i][j]].s;
        }
        cout<<endl;
    }
posted @ 2019-09-04 14:40  Doragd  阅读(139)  评论(0编辑  收藏  举报