pat 1055. 集体照

来源:互联网 发布:冬天四件套绒淘宝 编辑:程序博客网 时间:2024/06/05 19:24

原题链接:

思路:先排序然后找到关系,直接打印就好了。这里要吐槽下这个题,题意看了半天才懂啥意思。排序是按照身高逆序,却是按照姓名升序。最无语的就是测试数据了,我把k当成每排的人数写的代码都能通过三个测试点,最后才发现k是排数

#include<bits/stdc++.h>using namespace std;const int maxn=10005;int n,k;struct student{    char name[10];    int height;}stu[maxn];bool cmp(student stu1,student stu2){    if(stu1.height!=stu2.height){        return stu1.height<stu2.height;    }    return strcmp(stu1.name,stu2.name)>0;}//根据传入的左右边界打印出那一排void print(int left,int right){    int mid=(left+right+1)/2;    int ok=true;    for(int i=left;i<=right;i++){        if(!ok){            putchar(' ');        }        ok=false;        //升序排列,所以right的值对应的是mid位置        if(i<mid){            printf("%s",stu[right+1-(mid-i)*2].name);        }else{            printf("%s",stu[right-(i-mid)*2].name);        }    }    printf("\n");}void solve(){    cin>>n>>k;    for(int i=0;i<n;i++){        scanf("%s %d",stu[i].name,&stu[i].height);    }    sort(stu,stu+n,cmp);    int m=n/k;    if(m==0){        return;    }    for(int i=k-1;i>=0;i--){        int left=i*m;        print(left,n-1);        n=left;    }}int main(){    //freopen("in.txt","r",stdin);    solve();    return 0;}
原创粉丝点击