1109 Group Photo (25 分)
-
题目大意:给n个人排成k排,排列规则如下:
- 每排的人数必须为n/k(向下取整),多余的人排到下一排
- 后排所有人必须不矮于前排的任何人
- 每排都将最高的人安排在最中间(最中间为(m/2+1),m为那排的人数,结果要向下取整)
- 将人们按降序进入一排,然后按左右左右安排位置(For example, given five people with their heights 190, 188, 186, 175, and 170, the final formation would be 175, 188, 190, 186, and 170)
- 如果高度一样,则按名字增序排序。
注意:输出的最后面没有空格;先输出后面的,再输出前面的。
-
思路:
-
计算出每排站多少人:int num = n / k;
-
给n个人排序(按身高从高到低排,若身高相同,按名字增序排)
-
第一次拿出num + n % k个人出来,定义一个num + n % k大的数组,将第一个人放在中间(下标为m/2),若某个人被拿出来的顺序为奇数(从0开始),则把他放在(m/2 - i / 2 - 1);若为偶数,则放在(m/2 + i/2)处,输出。
之后每次拿出n/k个人出来,同样按上面的方法放置位置,输出。
注意:若k = 1,不用分第一次
-
-
知识点:
- vector
- sort
-
代码:
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; struct peo{ string name; int height; }; bool cmp(peo a, peo b){ return a.height != b.height ? a.height > b.height : a.name < b.name; } int main() { int n, k; scanf("%d %d", &n, &k); vector<peo> v(n); for(int i = 0; i < n; i++) cin >> v[i].name >> v[i].height; int num = n / k; sort(v.begin(), v.end(), cmp); int index = 0; // 被排位置的人的下标 for(int i = 0; i < k; i++){ int row = num, temp_row; // temp_row记录每排的人数 if(i == 0 && k != 1) row = num + (n % k); temp_row = row; vector<peo> temp(row); int mid = row / 2; for(int j = 0; row > 0; j++, row--, index++){ if(j == 0) temp[mid] = v[index]; else if(j % 2 == 1) temp[mid - j / 2 - 1] = v[index]; // 粗心,将j写成i else if(j % 2 == 0) temp[mid + j / 2] = v[index]; } if(i != 0) printf("\n"); for(int j = 0; j < temp_row; j++){ if(j != 0) printf(" "); cout << temp[j].name; } } return 0; }
-
总结:
- 思路清晰的话可以一次性解决问题,比迷迷糊糊地写完然后花大量时间调试节约时间
- 在多重循环里注意i和j不要写错了