提不起做题的兴趣惹……磨磨蹭蹭写了一道还不是满分,不知道自己错哪也不想找哈哈哈哈
PAT A1014
排队问题,n个窗口,每个窗口可以排m个人,剩余的人在等候区,当某个窗口排队人数小于m时候补进去,优先选择序号小的窗口。银行从8:00到17:00营业,只要你在下班前排到,办理一万分钟都行,输出所给顾客办理完业务的时间,如果不能在下班前排上队,就输出sorry。
这题开始看着懵逼,但是想想逻辑也很简单,磨磨蹭蹭写了很久,(并不是满分)
#include<iostream>
#include<algorithm>
using namespace std;
int need[1005] = { 0 };//办理业务时间 min
int nn[1005] = { 0 };
int ed[1005][1005] = { 0 };
int st[1005]={0};
int main()
{
int min = 999999;
int kk = 0;
int n, m, k, q;
cin >> n >> m >> k >> q;
int i, j, enq;
for (i = 0; i<k; i++)
{
cin >> need[i];
//cout << need[i] << endl;
}
for (i = 0; i<k; i++)
{
if (i<n)
{
ed[0][i] = need[i];
nn[i] = need[i];
//cout << nn[i] << endl;
}
else if (i >= n&&i<n*m)
{
st[i] = ed[i / n - 1][i%n];
ed[i / n][i%n] = ed[i / n - 1][i%n] + need[i];
nn[i] = ed[i / n][i%n];
//cout << nn[i] << "************"<<endl;
}
else
{
nn[i] = need[i];
//cout << need[i] << "^^^^^^" << endl;
min = 9999; kk = 0;
for (j = 0; j<n; j++)
{
if (ed[0][j]<min)//只考虑排队人数
{
min = ed[0][j];
kk = j;
}
}
//cout << "kk=" << kk << endl;
for (j = 1; j<m; j++)
{
ed[j - 1][kk] = ed[j][kk];
}
ed[m - 1][kk] += need[i];
st[i] = ed[m - 1][kk];
nn[i] = ed[m - 1][kk];
}
}
for (j = 0; j<q; j++)
{
cin >> enq;
if (st[enq - 1] <=540&& 8 + nn[enq - 1] / 60<=17)
{
if (nn[enq - 1] / 60 < 2)
cout << "0" << 8 + nn[enq - 1] / 60 << ":";
else cout << 8 + nn[enq - 1] / 60 << ":";
if (nn[enq - 1] % 60 < 10)
cout << "0" << nn[enq - 1] % 60;
else cout << nn[enq - 1] % 60;
}
else cout << "sorry";
if (j<q - 1)
cout << endl;
}
system("PAUSE");
return 0;
}
然后接下来是别人的答案,思路一样……好烦找不同啊哈哈哈哈
#include<iostream>
#include <vector>
#include <queue>
using namespace std;
int N, M, K, Q;
int main()
{
cin >> N >> M >> K >> Q;
vector<queue<int>>windows(N);//N个窗口
vector<int>endTime(K + 1);
vector<bool>Sorry(K + 1, false);//若前面那个人的业务办理时间超过下班时间,那么你是排不上的
int a, time;
for (int i = 0; i < K; ++i)
{
cin >> a;
if (i < N * M)//先将窗口的位子按序排满,存的是该人完成业务的时间
{
if (windows[i%N].size() > 0)
{
time = windows[i%N].back() + a;
windows[i%N].push(time);
Sorry[i + 1] = windows[i%N].back() >= 540 ? true : false;
}
else
{
time = a;
windows[i%N].push(a);
}
}
else//线外的人选择窗口排队
{
int minTime = windows[0].front(), index = 0;
for (int j = 1; j < N; ++j)//找到最先出现空位的窗口,然后去选择该窗口排队
{
if (minTime > windows[j].front())
{
index = j;
minTime = windows[j].front();
}
}
Sorry[i + 1] = windows[index].back() >= 540 ? true : false;
time = windows[index].back() + a;
windows[index].pop();//排完对队就离开
windows[index].push(time);//排队
}
endTime[i + 1] = time;
}
for (int i = 0; i < Q; ++i)
{
cin >> a;
time = endTime[a];
if (Sorry[a])
printf("Sorry\n");
else
printf("%02d:%02d\n", 8 + time / 60, time % 60);
}
return 0;
}
原文链接是:https://www.cnblogs.com/zzw1024/p/11191808.html
~~