思路:
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;
}
算法之路漫漫,还有很长的路要走啊