【PAT甲级】1109 Group Photo (25分)(模拟)

题意:

输入两个整数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<<"
";
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<<"
";
61     }
62     return 0;
63 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/12267290.html