1055 集体照
根据题目给的信息,倒着来看,在草稿纸上试试,总的来说,有点麻烦。
#include<iostream> #include<algorithm> using namespace std; struct Student { string name; int height; } stu[10010]; string ans[10010]; int num = 0; bool cmp(const Student& a,const Student& b) { if(a.height != b.height) return a.height > b.height; else return a.name < b.name; } void func(int n) { int m = n/2;//最高者放中间 ans[m] = stu[num++].name; int left = m-1,right = m+1; for(int i = 0; i < n-1; ++i) { //对剩余 n-1 个人 排列 if(i%2 == 0) ans[left--] = stu[num++].name;//先放左边 else ans[right++] = stu[num++].name;//后放右边 } for(int i = 0; i < n; ++i) {//输出当前排的学生姓名 if(i > 0) printf(" "); cout<<ans[i]; } printf("\n"); } int main() { int N,K,n; cin>>N>>K; for(int i = 0; i < N; ++i) cin>>stu[i].name>>stu[i].height; sort(stu,stu+N,cmp); if(N%K != 0) { //多出来的人全部站在最后一排 n = N/K+N%K;//最后一排 n 个人 func(n); } while(num < N){ func(N/K);//输出每一排 } return 0; }


浙公网安备 33010602011771号