码迷,mamicode.com
首页 > 其他好文 > 详细

PAT Basic 1055

时间:2018-08-12 10:25:17      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:sel   title   scan   ace   lin   people   pts   ase   超过   

1055 集体照

拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下:

  • 每排人数为 N/K(向下取整),多出来的人全部站在最后一排;

  • 后排所有人的个子都不比前排任何人矮;

  • 每排中最高者站中间(中间位置为 m/2+1,其中 m 为该排人数,除法向下取整);

  • 每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);

  • 若多人身高相同,则按名字的字典序升序排列。这里保证无重名。

现给定一组拍照人,请编写程序输出他们的队形。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出两个正整数 N(10?4??,总人数)和 K(10,总排数)。随后 N 行,每行给出一个人的名字(不包含空格、长度不超过 8 个英文字母)和身高([30, 300] 区间内的整数)。

输出格式:

输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方。

输入样例:

10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159

输出样例:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John
  题解:这道题思路一看就比较明确,但是确实有点麻烦,刚开始使用sort进行结构体排序,然后将排序好的数据依次放入数组中对应的位置,按要求输出即可。

代码如下:
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 struct people{
 6     string name;
 7     int height;
 8 };
 9 
10 bool cmp( const people &a, const people &b){
11     if( a.height != b.height)
12         return a.height > b.height;
13     else
14         return a.name < b.name;
15 }
16 
17 int main()
18 {
19     int n, k, temp1, temp2, temp3 = 0, j = 0;
20     scanf("%d %d", &n, &k);
21     people a[n];
22     temp1 = n/k;
23     temp2 = n%k;
24     for( int i = 0; i < n; i++){
25         cin>>a[i].name>>a[i].height;
26     }
27     sort(a,a+n,cmp);
28     people b[temp1 + temp2+3];
29     int flag = 1;
30     for( int i = 0; i < temp1 + temp2; i++,j++){
31         b[(temp1 + temp2)/2+1+temp3*flag].name = a[j].name;
32         if(flag == 1) temp3++;
33         flag = -flag;
34     }
35     bool flag2 = true;
36     for( int i = 1; i <= temp1 + temp2; i++){
37         if(flag2)
38             flag2 = false;
39         else
40             printf(" ");
41         cout<<b[i].name;
42     }
43     cout<<endl;
44     while( j < n){
45         people c[temp1+3];
46         flag = 1;
47         temp3 = 0;
48         for( int i = 0; i < temp1; i++,j++){
49             c[(temp1)/2+1+temp3*flag].name = a[j].name;
50             if(flag == 1) temp3++;
51             flag = -flag;
52         }
53         flag2 = true;
54         for( int i = 1; i <= temp1; i++){
55             if(flag2)
56                 flag2 = false;
57             else
58                 printf(" ");
59             cout<<c[i].name;
60         }
61         cout<<endl;
62     }
63     return 0;
64 }

 

 

PAT Basic 1055

标签:sel   title   scan   ace   lin   people   pts   ase   超过   

原文地址:https://www.cnblogs.com/yxp400/p/9461871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!