题意:
输入两个整数 N 和 K(N<=1e4,K<=10), 分别表示人数和行数, 接着输入 N 行每行包括学生的姓名 (八位无空格字母且唯一) 和身高 ([30,300] 的整数). 按照身高逆序, 姓名字典序升序将学生从高到矮排列, 将学生均分为 N 行输出, 最先输出的一行人数包括除不尽的余数学生, 每行中间(如果这一行学生人数为偶数则靠右的为中间) 的学生最高, 然后依次左边一位学生最高, 右边一位学生最高, 例如 190, 188, 186, 175, 170->175, 188, 190, 186, 170.
trick:
把 K 看成了每行的学生个数而不是行数(竟然能过前三个数据点).....
- AAAAAccepted code:
- #define HAVE_STRUCT_TIMESPEC
- #include<bits/stdc++.h>
- using namespace std;
- pair<int,string>pr[10007];
- bool cmp(pair<int,string>a,pair<int,string>b){
- if(a.first!=b.first)
- return a.first<b.first;
- return a.second>b.second;
- }
- string ans[10007];
- int main(){
- iOS::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- int n,k;
- cin>>n>>k;
- for(int i=1;i<=n;++i)
- cin>>pr[i].second>>pr[i].first;
- sort(pr+1,pr+1+n,cmp);
- int m=n;
- int x=n-n/k*k+n/k;
- int cnt=x;
- int temp=0;
- int t=0;
- int flag=-1;
- while(cnt--){
- ans[x/2+1+temp]=pr[m--].second;
- if(flag<0)
- ++t;
- temp=t*flag;
- flag=-flag;
- }
- int num=x;
- for(int i=1;i<k;++i){
- int cnt=n/k;
- int temp=0;
- int t=0;
- int flag=-1;
- while(cnt--){
- ans[num+n/k/2+1+temp]=pr[m--].second;
- if(flag<0)
- ++t;
- temp=t*flag;
- flag=-flag;
- }
- num+=n/k;
- }
- for(int i=1;i<=x;++i){
- cout<<ans[i];
- if(i<x)
- cout<<" ";
- else
- cout<<"\n";
- }
- for(int i=x+1;i<=n;++i){
- cout<<ans[i];
- if((i-x)%(n/k))
- cout<<" ";
- else if(i<n)
- cout<<"\n";
- }
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3408812.html