照毕业照一定要排好队,不然就会有人被挡住,造成终身遗憾。假设有N个毕业生,准备排K行,拍毕业照的摄影师定下这么几条规矩:
1、每一行的人数一定是N/K个,如果有多的同学,全部站最后一排;
2、后排的一定不能比前排任何一个同学矮;
3、在任意一排,个子最高的站中间,之后次高的站他的右边,第三高的站他的左边,第四高的又站右边,这样依次轮换。例如,有5个同学,身高依次是190厘米,188厘米,186厘米,175厘米和170厘米,那么最后应该排成175,188, 190,186, 170。这里我们假设摄影师面向同学们站立,这样摄影师的左手就是同学们的右手。
4、如果身高相同,那就按姓名的字母序的升序排列,我们假定没有重名的。
输入格式:
每个输入包括一个测试用例,第一行有两个正整数N和K,其中N是毕业生总数,K是排数。 N<=10000,K<=10,随后N行,分别给出不超过8个字符的姓名以及他们的身高,姓名中不含空格。
输出格式:
对每一组输入,显示出毕业生拍照时的位置情况,要求打印K行学生的姓名,姓名之间以1个空格分隔,行尾不得有多余空格。因为你是面向毕业生的,所以在最后一排的同学应该显示在第一行,在第一排的同学显示在最后一行。
输入样例:
在这里给出一组输入。例如:
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
代码如下:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
struct node{
string name;
int tall;
}st[10005];
bool cmp(node a,node b){
if(a.tall==b.tall) return a.name<b.name;
return a.tall>b.tall;
}
void paixu(int a,int b[]){
int c;
c=a%2?a-2:a-1;
for(int i=0;i<a/2;i++){
b[i]=c;
c=c-2;
}
c=0;
for(int i=a/2;i<a;i++){
b[i]=c;
c+=2;
}
}
void shuchu(int b[],int start,int T){
for(int i=0;i<T;i++){
if(i)cout<<" ";
cout<<st[b[i]+start].name;
}
cout<<endl;
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>st[i].name>>st[i].tall;
}
sort(st,st+n,cmp);
int T;
// for(int i=0;i<n;i++){
// cout<<st[i].name<<endl;
// }
for(int i=0;i<n;i=i+T){
T=n/k;
if(!i){
T=n/k+(n%k);
}
int *q=new int[T];
paixu(T,q);
shuchu(q,i,T);
delete[] q;
}
return 0;
}