PAT甲组1080.Graduate Admission思路与注意点--补充《算法笔记》

A1080

题目链接

思路与注意点

使用结构体存放学生的成绩志愿与排名信息
按总成绩排序(GE),写入名次后再按名次排序。遍历所有学生和其志愿,用二维vector存学校录取情况,有名额则录取,无名额则与 录取的最后一位作比较(此处有错误,耗费大量时间才找到),排名相同则予以录取。输出时对每行vector排序(按id)随后输出

一开始卡在测试点4,一开始时间复杂度高,运行超时,后将vector迭代器改为find函数,发现测试4出错,搜遍了全网也未能找到与我错误相同的帖子
错误之处:当无名额时,并非与最后一位同学的排名作比较,而是和报考同一所学校的最后一名同学作比较(可能由于思路相差不大,因此一直找不到错误),因为跟上一个同学排名相同并不代表要去同一所学校。

代码

#include <bits/stdc++.h>
using namespace std;
int N, M, K;
int school[105];
int lastRank[105]; 
vector<vector<int> > accept(105);
struct student{
	int id;
	int ge;
	int gi;
	int total;
	int choices[6];
	int rank;
	student(){}
}stu[40005];
bool cmpTotal(student s1, student s2)//按总分排,总分相同按ge排 
{
	if(s1.total != s2.total)
	{
		return s1.total > s2.total;
	}
	else
	{
		return s1.ge > s2.ge;
	}
}
bool cmpRank(student s1, student s2)
{
	return s1.rank < s2.rank;
} 
int main(int argc, char *argv[]) {
	//输入 
	scanf("%d%d%d", &N, &M, &K);
	for(int i = 0; i < M; i++)
	{
		scanf("%d", &school[i]);
	}
	for(int i = 0; i < N; i++)
	{
		stu[i].id = i;
		scanf("%d%d", &stu[i].ge, &stu[i].gi);
		stu[i].total = stu[i].ge + stu[i].gi;
		for(int j = 0; j < K; j++)
		{
			scanf("%d", &stu[i].choices[j]);
		}
	}
	//排名 
	sort(stu, stu + N, cmpTotal);
	stu[0].rank = 1;
	for(int i = 1; i < N; i++)
	{
		if(stu[i].total != stu[i - 1].total)//总分不等 
		{
			stu[i].rank = i + 1;
		}
		else
		{
			if(stu[i].ge != stu[i - 1].ge)
			{
				stu[i].rank = i + 1; 
			}
			else
			{
				stu[i].rank = stu[i - 1].rank;
			}
		}
	}
	sort(stu, stu + N, cmpRank);
	for(int i = 0; i < N; i++)//对申请遍历 
	{
		for(int j = 0; j < K; j++)//对志愿遍历 
		{
			int index = stu[i].choices[j];
			if(school[index])//有名额 
			{
				accept[index].push_back(stu[i].id);
				lastRank[index] = stu[i].rank;
				school[index]--;
				break;
			}
			else//无名额 
			{
				//与上一个人名次相同,报考学校相同 
				//!!!!错误原因,其上一个学生虽然排名相同,并不一定要去同一所学校 
				//所以要跟去同一所学校的上一个学生比排名 
				if(i != 0 && stu[i].rank == lastRank[index])
				{
					accept[index].push_back(stu[i].id);
					lastRank[index] = stu[i].rank;
					break;	
				} 
				else
				{
					continue;
				}
			}
		}
	} 
	//输出
	for(int i = 0; i < M; i++)
	{
		if(accept[i].size())
		{
			bool flag = false;
			sort(accept[i].begin(), accept[i].end());
			for(vector<int>::iterator it = accept[i].begin(); it != accept[i].end(); it++)
			{
				if(!flag)
				{
					printf("%d", *it);
					flag = true;
				}
				else
				{
					printf(" %d", *it);
				}
			}
		}
		printf("\n");
	} 
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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[]{"A组学生1", "A组学生2", "A组学生3"}); // 遍历数据 for (String teacher : teacherClassMap.keySet()) { String className = teacherClassMap.get(teacher); System.out.println(teacher + " 管理的班级是:" + className); for (String groupName : groupMap.keySet()) { String[] groupName = groupMap.get(className); System.out.println(className + " 所有的组是:" + groupName); String[] students = classStudentMap.get(groupName); for (String student : students) { System.out.println(" 学生姓名:" + student); } } } } }
最新发布
07-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值