PAT (Advanced Level) Practice 刷题分类、测试点简述、做题总结

主要是帮助自己总结,如果有需要某题测试点的可以留言,我可能测过

图论

单源最短路

1003 Emergency (25 分)

并查集

1013 Battle Over Cities (25 分)
题解:dfs联通部分判true,访问要继续搜索下去,已访问节点要判定true
解法2.某城市被军队占领了,剩下的城市要相互联系需要建造多少条路,并查集

test data
4 3 4
1 2
1 3
2 4
1 2 3 4
out.txt
1
1
0
0

7-3 Safari Park (25 分)

  • PAT(甲级)2020年春季考试
    题目:给你n个动物,其中r个关系,其中由k个种群,问每个种群是不是都是相邻物种

模拟

简单

1012 The Best Rank (25 分)
题解: 排序+记录,相同分数排名相同
hack data
in.txt

5 6
310101 91 91 91
310102 91 91 91
310103 91 91 91
310104 91 91 91
310105 90 90 90
310101
310102
310103
310104
310105
999999

out.txt

1 A
1 A
1 A
1 A
5 A
N/A

1010 Radix (25 分)
题解:进制计算函数+二分查找基数,越界情况由计算机补码存数为负数可知

队列运用

1014 Waiting in Line (30 分)
题解:记录窗口第一个人结束的时间,窗口最后一个人结束的时间,以及中间每个人的时间(由于每个人的服务时间长度是不同的,所以每个窗口排队我们使用队列进行处理)

其余的关键内容都注释在代码当中

#include <bits/stdc++.h>
using namespace std;
/*
	n个窗口、m个最大黄色队列、k顾客个数、q个顾客查询,每次选择最短的队列排
	柳神代码	
*/
const int maxn = 22;
const int MAXN = 1111;
//时间直接记录经过的分钟数,方便比较,最后输出结果的时候再做处理即可
struct node
{
    
    
	int poptime, endtime; //队列中第一个人结束的时间和队列中最后一个人结束的时间
	queue<int> q; //
};

int main(){
    
    
	int n, m, k, q; cin >> n >> m >> k >> q;
	std::vector<int> time(k + 1);
	std::vector<int> result(k + 1);//记录每个人完成事务的时间
	for(int i = 1; i <= k; i++){
    
    
		cin >> time[i]; //输入每个顾客所需要花费的时间
	}
	std::vector<node> window(n + 1); //存储每个窗口的情况
	std::vector<bool> sorry(k + 1, false); //记录超时的人群

	//分两个部分,首先是如果n个窗口都没有排满的时候直接排队即可,然后是

	int index = 1;
	//有n个窗口每个窗口最多可以排m个人
	//第i个位置,第j个窗口,因为每次选择最短的队列进行排队
	for(int i = 1; i <= m; i++){
    
    
		for(int j = 1; j <= n; j++){
    
    
			if (index <= k){
    
    
				//只用处理k个人
				window[j].q.push(time[index]);//将当前人所需要花费的时间压入窗口队列当中
				if (window[j].endtime >= 540){
    
    
					sorry[index] = true;
					//如果服务时间超过17;00就不能服务了,判断为当前人是sorry
				}
				window[j].endtime += time[index]; //当前服务的人所需要的时间
				if (i == 1)
					window[j].poptime = window[j].endtime;//最开始的时候,确定队列减少一个人所需要花费的时间
				result[index] = window[j].endtime;//并且记录这个人的完成时间
				index++;
			}

		}
	}


	while(index <= k){
    
    
		
		int tempmin = window[1].poptime,tempwindow = 1;
		//找到最快排到下一个人的队伍,最快出队poptime
		for(int i = 2; i <= n; i++){
    
    
			if (window[i].poptime < tempmin){
    
    
				tempwindow = i;//记录是哪个窗口
				tempmin = window[i].poptime;
			}
		}

		window[tempwindow].q.pop();//当前窗口的第一个人完成服务
		window[tempwindow].q.push(time[index]);//压入新的一个人
		window[tempwindow].poptime += window[tempwindow].q.front();//当前窗口第一个出队时间

		if (window[tempwindow].endtime >= 540){
    
    
			sorry[index] = true; //同样也要对超时时间进行判断
		}
		
		window[tempwindow].endtime += time[index]; //现在去排的就变成最后一位了
		result[index] = window[tempwindow].endtime;//那么这个人的结束时间也可以确定了
		index++;
	}

	for(int i = 1; i <= q; i++){
    
    
		int query, minute;
		cin >> query;
		minute = result[query];
		if (sorry[query]){
    
    
			printf("Sorry\n");
		}
		else {
    
    
			printf("%02d:%02d\n",(minute + 480) / 60, (minute + 480) % 60);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43382350/article/details/122442504