PAT甲组1109.Group Photo思路解析和代码

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码存在一些错误,我已经修改了一下: ```java import java.util.HashMap; public class Manage { public static void main(String[] args) { HashMap<String, String> teacherClassMap = new HashMap<>(); // 存储老师和班级的对应关系 HashMap<String, String[]> groupMap = new HashMap<>(); // 存储班级和小组的对应关系 HashMap<String, String[]> classStudentMap = new HashMap<>(); // 存储班级和学生的对应关系 // 添加数据 teacherClassMap.put("小王", "一班"); teacherClassMap.put("小李", "二班"); teacherClassMap.put("小明", "三班"); groupMap.put("一班", new String[]{"一组", "二组", "三组"}); groupMap.put("二班", new String[]{"甲组", "乙组", "丙组"}); groupMap.put("三班", new String[]{"A组", "B组", "C组"}); classStudentMap.put("一组", new String[]{"一组学生1", "一组学生2", "一组学生3"}); classStudentMap.put("二组", new String[]{"二组学生1", "二组学生2", "二组学生3"}); classStudentMap.put("三组", new String[]{"三组学生1", "三组学生2", "三组学生3"}); classStudentMap.put("甲组", new String[]{"甲组学生1", "甲组学生2", "甲组学生3"}); classStudentMap.put("乙组", new String[]{"乙组学生1", "乙组学生2", "乙组学生3"}); classStudentMap.put("丙组", new String[]{"丙组学生1", "丙组学生2", "丙组学生3"}); classStudentMap.put("A组", new String[]{"A组学生1", "A组学生2", "A组学生3"}); classStudentMap.put("B组", new String[]{"B组学生1", "B组学生2", "B组学生3"}); classStudentMap.put("C组", new String[]{"C组学生1", "C组学生2", "C组学生3"}); // 遍历数据 for (String teacher : teacherClassMap.keySet()) { String className = teacherClassMap.get(teacher); System.out.println(teacher + " 管理的班级是:" + className); String[] groups = groupMap.get(className); for (String groupName : groups) { System.out.println(className + " 所有的组是:" + groupName); String[] students = classStudentMap.get(groupName); for (String student : students) { System.out.println(" 学生姓名:" + student); } } } } } ``` 这段代码将会输出老师、班级、小组和学生的对应关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值