PAT甲题 1014 Waiting in Line

PAT甲题 1014 Waiting in Line

思路:

1.网上大家都是用的队列,好像最近用map用的上瘾我依旧用了map;
2.每有一个人进黄线内,他的开始时间和结束时间就已经确定,我定义了一个map存储顾客号和他的结束时间,若开始时间在五点或五点以后则不记录;
3.定义一个map存储时间序列,即从小到大存储每个会有人离开的时间点,时间是关键字,窗口号是值,若此时有多人离开,将所有窗口号取出从小到大进行排序,然后依次进人;

注意点:

1.只要开始时间在五点前,都进行服务,而不比较结束时间;
2.用分钟做,最后输出再化成时间格式;
3.最后一点坑到我了,但是我看别人都没什么问题,就是不仅在黄线外的要考虑Sorry,在黄线里的也要加上Sorry,很常识对吧,但是我花了很久才发现我程序在黄线内忘记判断了,如果测试点4没过,那就是这个原因了

代码:

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
bool cmp(int a, int b)
{
	 return a < b;
}
int N, M, K, Q, cost, inputNo = 1;
map<int, int> mp;   
multimap<int, int> tQueue;  //时间序列
int main()
{
 cin >> N >> M >> K >> Q;
 int total_t[N] = { 0 };
 for (int i = 0; i < M&&inputNo <= K; i++)
 	 for (int j = 0; j < N&&inputNo <= K; j++, inputNo++)
 	 {
  		 cin >> cost;
  		 if (total_t[j] < 540)  //前面累计时间>=540时不计入
  		 {
  			  total_t[j] += cost;
   			  tQueue.insert(make_pair(total_t[j], j));
   			  mp[inputNo] = total_t[j];
 		  }
	  }
 map<int, int>::iterator it = tQueue.begin();
 while (inputNo <= K)   //人数若大于N*M
 {
	  int t, no[N];
	  no[0] = it->second;
	  t = (it++)->first;
	  int i = 1;
	  for (; it->first == t; i++, it++)
	  	 no[i] = it->second;  //将相同时间点依次取出
	  sort(no, no + i, cmp);
	  for (int j = 0; j < i&&inputNo <= K; j++, inputNo++)
	  {
	 	  cin >> cost;
	 	  if (total_t[no[j]] < 540)   //前面累计时间>=540时不计入
	 	  {
	   		 total_t[no[j]] += cost;
	   		 tQueue.insert(make_pair(total_t[no[j]], no[j]));
	  		 mp[inputNo] = total_t[no[j]];
	 	  }
	  }
}
for (int i = 0; i < Q; i++)
 {
	  int c_id;
	  cin >> c_id;
	  mp[c_id] != 0 ? printf("%02d:%02d
", mp[c_id] / 60 + 8, mp[c_id] % 60) : printf("%s
", "Sorry");
 }
 return 0;
}

算法之路漫漫,还有很长的路要走啊

原文地址:https://www.cnblogs.com/yuhan-blog/p/12309115.html