pat甲级1014(30分)c++
类型:queue
题目就省去了,在下面的分析中有加入题目大意,代码是c++编写,但是有对每一个小模块代码进行注释,思路是可以被其他不同编程语言所使用
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
/*
* 题目大意:
* 输入:
* n,m,k,q分别是窗口数,每个窗口最多排队人数,客户总数,输出客户数
* 第二行是对应了k个客户分别处理所需要的时间
* 第三行是对应了q个客户的编号(客户的编号从1到k)
* 输出:
* q个客户的结束时间或者sorry
*/
/*
* 总结:
* 本题最重要的是先理解,然后构造一个所需的结构体,承载需要的属性(一个结构体可以在很大程度上简化你的代码和更简单的编写逻辑),然后需要学会测试,如果输出不正确,会很难以找到错误,需要一个模块一个模块进行测试,找到错误
* 代码虽然很长,但是思路很简单
*/
/*
* node结构体
* poptime:队首结束时间,可用于判断哪个队列先空出一人
* endtime:队尾结束时间,可用于判断是否超时
* q:存放对应客户处理所需时间的队列
*/
struct node {
int poptime, endtime;
queue<int> q;
};
int main() {
//初始化,index为第index客户
int n, m, k, q, index = 1;
scanf("%d%d%d%d", &n, &m, &k, &q);
//k个人的处理时间数组和完成时间数组
vector<int> time(k + 1), result(k + 1);
for(int i = 1; i <= k; i++) {
scanf("%d", &time[i]);
}
//window是对应了n个窗口,sorry是默认k个人都不超时
vector<node> window(n + 1);
vector<bool> sorry(k + 1, false);
//初始化window和sorry
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if(index <= k) {//人数未超过k
//初始化node
window[j].q.push(time[index]);
if(window[j].endtime >= 540)//540为处理的总时间,判断是否超时
sorry[index] = true;
window[j].endtime += time[index];
if(i == 1)
window[j].poptime = window[j].endtime;
result[index] = window[j].endtime;
index++;
}
}
}
//如果n*m<=k,主要是针对result数组和sorry数组的更新
while(index <= k) {
//tempmin为最早出队的时间,tempwindow为最早出队的窗口
int tempmin = window[1].poptime, tempwindow = 1;
for(int i = 2; i <= n; i++) {
if(window[i].poptime < tempmin) {
tempwindow = i;
tempmin = window[i].poptime;
}
}
//对tempwindow的窗口进行队首出队和入队新客户,需要进行更新poptime和endtime,以及对sorry数组和result数组进行更新
window[tempwindow].q.pop();
window[tempwindow].q.push(time[index]);
window[tempwindow].poptime += window[tempwindow].q.front();
//需要提醒的一点是,判断sorry的条件是开始处理的时间是否超时,所以先使用原来队列的endtime进行判断,再进行更新队列的endtime
if(window[tempwindow].endtime >= 540)
sorry[index] = true;
window[tempwindow].endtime += time[index];
result[index] = window[tempwindow].endtime;
index++;
}
//输出格式化操作,主要是使用了result数组和sorry数组
for(int i = 1; i <= q; i++) {
int query, minute;
scanf("%d", &query);
minute = result[query];
if(sorry[query] == true) {
printf("Sorry\n");
} else {
printf("%02d:%02d\n",(minute + 480) / 60, (minute + 480) % 60);
}
}
return 0;
}
记录这个题目的原因是,第一原题描述很长,代码也很长,但是思路很简单