题意:
输入两个整数N和K(N<=1e4,K<=10),分别表示人数和行数,接着输入N行每行包括学生的姓名(八位无空格字母且唯一)和身高(【30,300】的整数)。按照身高逆序,姓名字典序升序将学生从高到矮排列,将学生均分为N行输出,最先输出的一行人数包括除不尽的余数学生,每行中间(如果这一行学生人数为偶数则靠右的为中间)的学生最高,然后依次左边一位学生最高,右边一位学生最高,例如190, 188, 186, 175, 170->175, 188, 190, 186, 170。
trick:
把K看成了每行的学生个数而不是行数(竟然能过前三个数据点)。。。。。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 pair<int,string>pr[10007]; 5 bool cmp(pair<int,string>a,pair<int,string>b){ 6 if(a.first!=b.first) 7 return a.first<b.first; 8 return a.second>b.second; 9 } 10 string ans[10007]; 11 int main(){ 12 ios::sync_with_stdio(false); 13 cin.tie(NULL); 14 cout.tie(NULL); 15 int n,k; 16 cin>>n>>k; 17 for(int i=1;i<=n;++i) 18 cin>>pr[i].second>>pr[i].first; 19 sort(pr+1,pr+1+n,cmp); 20 int m=n; 21 int x=n-n/k*k+n/k; 22 int cnt=x; 23 int temp=0; 24 int t=0; 25 int flag=-1; 26 while(cnt--){ 27 ans[x/2+1+temp]=pr[m--].second; 28 if(flag<0) 29 ++t; 30 temp=t*flag; 31 flag=-flag; 32 } 33 int num=x; 34 for(int i=1;i<k;++i){ 35 int cnt=n/k; 36 int temp=0; 37 int t=0; 38 int flag=-1; 39 while(cnt--){ 40 ans[num+n/k/2+1+temp]=pr[m--].second; 41 if(flag<0) 42 ++t; 43 temp=t*flag; 44 flag=-flag; 45 } 46 num+=n/k; 47 } 48 for(int i=1;i<=x;++i){ 49 cout<<ans[i]; 50 if(i<x) 51 cout<<" "; 52 else 53 cout<<"\n"; 54 } 55 for(int i=x+1;i<=n;++i){ 56 cout<<ans[i]; 57 if((i-x)%(n/k)) 58 cout<<" "; 59 else if(i<n) 60 cout<<"\n"; 61 } 62 return 0; 63 }
原文地址:https://www.cnblogs.com/ldudxy/p/12267290.html
时间: 2024-11-09 13:03:33