A1014 Waiting in Line (30 分)

开始对于题意的理解有问题,最后一句说不能在17点之前包括17点接受服务的才输出sorry,而不是在17点之前不能结束服务才输出sorry

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>wintoid[25];
int N, M, K, Q;
int process[1010], query[1010], idtowin[1010], wintime[1010] = { 0 };
void init()
{
	int now = 1,window=1;
	for (int i = 1; i <= M&&now<=K; i++)
	{
		for (int j = 1; j <= N&&now<=K; j++)
		{
			wintoid[j].push_back(now);
			idtowin[now] = j;
			if (i == 1) wintime[j] = process[now];
			now++;
		}
    }
}
int main()
{
	scanf("%d%d%d%d", &N, &M, &K, &Q);
	for (int i = 1; i <= K; i++) scanf("%d", &process[i]);
	for (int i = 1; i <= Q; i++) scanf("%d", &query[i]);
	init();
	if (N*M < K)
	{
		int p ;
		int num[25];//记录wintoid数组的第几个元素
		fill(num,num+25,1);//由于vector从0开始,这里从第一个开始累加
		for (int i = N * M + 1; i <= K; i++)
		{
			int min = 1e4;
			for (int j = 1; j <= N; j++)//筛选所有窗口第一个时间最短的
			{
				if (wintime[j] < min)
				{
					min = wintime[j];
					p = j;
				}
			}
			
			wintoid[p].push_back(i);
			idtowin[i] = p;
			wintime[p] += process[wintoid[p][num[p]++]];
		}
	}
	//处理query
	for (int i = 1; i <= Q; i++)
	{
		int totaltime = 0;
		int winid = idtowin[query[i]];
		for (int j=0;j<wintoid[winid].size();j++)
		{
			totaltime += process[wintoid[winid][j]];
			if (wintoid[winid][j] == query[i])
			{
				int servetime = totaltime - process[wintoid[winid][j]];
				int sh = servetime / 60;
				int sm = servetime % 60;
				int h = totaltime / 60;
				int m = totaltime % 60;
				if (8 + sh >= 17) printf("Sorry\n");
				else printf("%02d:%02d\n", 8 + h, m);
				break;
			}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值