一、题目描述
原题链接
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;
}