A1109
个人思路
本题属于模拟题、
- 明确题意,个子高的站后一排,低的站前一排,且最高的在一排的中间,其他人先右后左交替入队
- 模拟过程始终是面向队伍的,队伍右侧是自己的右手边,且最后一排实际是矩阵的第一行
- 按个子高低和名字排序
- 遍历所有同学一次填入矩阵中
- 以中间的同学为基准控制左右方向,每排完一次左右两名同学,间距dir要增加1
- 自己模拟整个过程直观感受一下
个人思路代码
#include <bits/stdc++.h>
using namespace std;
int N, K;
struct Student{
char name[15];
int height;
}stu[10005];
int matrix[100][10005];
bool cmp(Student s1, Student s2)
{
if(s1.height != s2.height)
return s1.height > s2.height;
else
return strcmp(s1.name, s2.name) < 0;
}
int main(int argc, char *argv[]) {
scanf("%d%d", &N, &K);
getchar();
for(int i = 0; i < N; ++i)
{
scanf("%s %d", stu[i].name, &stu[i].height);
getchar();
}
sort(stu, stu + N, cmp);
int col = N / K;//正常一排人数
int lastcol = N - (col * (K - 1));
int x = 1, y = 1;//矩阵的行列
int cnt = 0, mid = 0;//一排已经排列的人数,中间位置
int dir = 0;//表示左右方向的间距
col = lastcol;
for(int i = 0; i < N; ++i)
{
if(x > 1)
col = N / K;
if(cnt == col)//一行排满
{
x++;
cnt = 0;
dir = 0;
i--;
continue;
}
if(cnt == 0)
{
mid = (col / 2) + 1;
y = mid;
}
else if(cnt % 2 == 1)//先往右排
{
dir++;
y = mid - dir;
}
else
{
y = mid + dir;
}
matrix[x][y] = i;
cnt++;
}
col = lastcol;
for(int i = 1; i <= K; i++)
{
if(i > 1)
col = N / K;
for(int j = 1; j <= col; j++)
{
int index = matrix[i][j];
printf("%s", stu[index].name);
if(j < col)
printf(" ");
}
printf("\n");
}
return 0;
}
附赠样例
10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159
ans
Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John
12 3
0 12
1 11
2 10
3 9
4 8
5 7
6 6
7 5
8 4
9 3
10 2
11 1
ans
3 1 0 2
7 5 4 6
11 9 8 10
12 1
0 12
1 11
2 10
3 9
4 8
5 7
6 6
7 5
8 4
9 3
10 2
11 1
ans
11 9 7 5 3 1 0 2 4 6 8 10
12 5
0 12
1 11
2 10
3 9
4 8
5 7
6 6
7 5
8 4
9 3
10 2
11 1
ans
3 1 0 2
5 4
7 6
9 8
11 10