PAT甲级1109 Group Photo (25分)|C++实现

    科技2022-08-03  104

    一、题目描述

    原题链接

    Input Specification:

    ​​Output Specification:

    Sample Input:

    10 3 Tom 188 Mike 170 Eva 168 Tim 160 Joe 190 Ann 168 Bob 175 Nick 186 Amy 160 John 159

    Sample Output:

    Bob Tom Joe Nick Ann Mike Eva Tim Amy John

    二、解题思路

    模拟题,注意最后一排和前面数量规范的几排是不一样的,我这里选择了分开处理。随后只要按照题目规律把元素填进去,这个其实很像hash处理冲突的平方探测法,对每一行进行输出即可。

    三、AC代码

    #include<iostream> #include<cstdio> #include<vector> #include<string.h> #include<algorithm> using namespace std; struct Student //名字和身高 { char name[10]; int height; }; bool cmp(Student a, Student b) //按高度从高到低,相同高度按名字字母表顺序排序 { if(a.height != b.height) return a.height > b.height; else return strcmp(a.name, b.name) < 0; } int main() { int N, K, row_num; scanf("%d%d", &N, &K); vector<Student> v(N); for(int i=0; i<N; i++) scanf("%s %d", v[i].name, &v[i].height); sort(v.begin(), v.end(), cmp); row_num = N/K; //每排的人数 int last_r = 0; if(N%K != 0) //多出来的人都放在最后一排 { last_r = row_num + N%K; Student each[last_r]; int pos, round=1, mid = last_r/2; each[mid] = v[0]; pos = last_r/2 - 1; //中间左边一位 for(int i=1; i<last_r; i++) { each[pos] = v[i]; if(pos < mid) pos = mid + round; //中间右边 else { round++; pos = mid - round; //先左后右 } } for(int i=0; i<last_r; i++) //从左到右输出 { if(i == 0) printf("%s", each[i].name); else printf(" %s", each[i].name); } printf("\n"); } for(int i=last_r; i<N; i+=row_num) //处理前面数量规范的学生 { Student each[row_num]; int round=1, mid = row_num/2; each[mid] = v[i]; int pos = mid-round; for(int j=i+1; j<i+1+row_num; j++) { each[pos] = v[j]; if(pos < mid) pos = mid + round; else { round++; pos = mid - round; } } for(int j=0; j<row_num; j++) { if(j == 0) printf("%s", each[j].name); else printf(" %s", each[j].name); } printf("\n"); } return 0; }
    Processed: 0.009, SQL: 8