一、题目描述
 
原题链接 
 
Input Specification:
 
 
Output Specification:
 
 
Sample Input:
 
10 3 Tom 188 Mike 170 Eva 168 Tim 160 Joe 190 Ann 168 Bob 175 Nick 186 Amy 160 John 159
 
Sample Output:
 
Bob Tom Joe Nick Ann Mike Eva Tim Amy John
 
二、解题思路
 
模拟题,注意最后一排和前面数量规范的几排是不一样的,我这里选择了分开处理。随后只要按照题目规律把元素填进去,这个其实很像hash处理冲突的平方探测法,对每一行进行输出即可。
 
三、AC代码
 
#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std
;
struct Student  
{
  char name
[10];
  int height
;
};
bool cmp(Student a
, Student b
)  
{
  if(a
.height 
!= b
.height
)	return a
.height 
> b
.height
;
  else	return strcmp(a
.name
, b
.name
) < 0;
}
int main()
{
  int N
, K
, row_num
;
  scanf("%d%d", &N
, &K
);
  vector
<Student
> v(N
);
  for(int i
=0; i
<N
; i
++)
   	scanf("%s %d", v
[i
].name
, &v
[i
].height
);
  sort(v
.begin(), v
.end(), cmp
);
  row_num 
= N
/K
;    
  int last_r 
= 0;
  if(N
%K 
!= 0)  
  {
    last_r 
= row_num 
+ N
%K
;
    Student each
[last_r
];
    int pos
, round
=1, mid 
= last_r
/2;
    each
[mid
] = v
[0];
    pos 
= last_r
/2 - 1; 
    for(int i
=1; i
<last_r
; i
++)
    {
      each
[pos
] = v
[i
];
      if(pos 
< mid
)	pos 
= mid 
+ round
;  
      else
      {
        round
++;
        pos 
= mid 
- round
;  
      }
    }
    for(int i
=0; i
<last_r
; i
++) 
    {
      if(i 
== 0)	printf("%s", each
[i
].name
);
      else	printf(" %s", each
[i
].name
);
    }
    printf("\n");
  }
  for(int i
=last_r
; i
<N
; i
+=row_num
)    
  {
    Student each
[row_num
];
    int round
=1, mid 
= row_num
/2;
    each
[mid
] = v
[i
];
    int pos 
= mid
-round
;
    for(int j
=i
+1; j
<i
+1+row_num
; j
++)
    {
      each
[pos
] = v
[j
];
      if(pos 
< mid
)	pos 
= mid 
+ round
;
      else
      {
        round
++;
        pos 
= mid 
- round
;
      }
    }
    for(int j
=0; j
<row_num
; j
++)
    {
      if(j 
== 0)	printf("%s", each
[j
].name
);
      else	printf(" %s", each
[j
].name
);
    }
    printf("\n");
  }
  return 0;
}