1014. Waiting in Line 解析

for those customers who cannot be served before 17:00

for those customers who cannot be served before 17:00

for those customers who cannot be served before 17:00

看三遍......审题还是很重要的。_(:з)∠)_虽然被坑了无数次还是看漏哎。。。

还有就是最后一个测试点是测时间都相同的时候的时间。就是几个队列要同时出队。我单独做了判定一起出队。网上有很多思路非常清晰的解法。大家可以参考下。

我是模拟了整个过程。

……………………更新线……………………

可以参考大神的做法 : http://blog.csdn.net/sunbaigui/article/details/8656844

思路非常简单清晰

其实插入的过程可以更加简单,每次选取最先出来的人的那个窗口进行插入。

我自己写一直没有解决时间更新的问题,每次选的窗口有点不对。

那我们应该怎么办。。每次直接计算出完成服务的时间,然后模拟队列的过程,每次取队列首的离开时间来选取,这样就能选择正确的窗口。

………………………………………………………………


#include <iostream>
#include <string>
#include <vector>
#include <queue>

using namespace std;

void printTime(int time) { //打印时间 输入按分钟为单位
	int hours, minutes;

	hours = time / 60 + 8;
	minutes = time % 60;
	printf("%02d", hours);
	cout << ":";
	printf("%02d", minutes);
	cout << endl;

}

int MinTime(queue <int> *win,int N){ //找最短队列  N窗口数
	
	int minI = 0;
	int minSize = win[0].size();

	for (int i = 0; i < N; i++) {
		if (win[i].size() < minSize) {
			minSize = win[i].size();
			minI = i;
		}
	}
	
	return minI;

}


int DeQueueTime(queue <int> *win,int N){  //最早出队的窗口  N窗口数
	int minI = 0;
	int minSize = win[0].front();

	for (int i = 0; i < N; i++) {
		if (win[i].front() < minSize) {		
			minSize = win[i].front();
			minI = i;
		}
	}

	for (int i = 0; i < N; i++) { //对相同时间出队的成员一起出队
		if (win[i].front() == minSize) {
			win[i].pop();
		}
	}


	return minI;
}


int main() {
	int N, M, K, Q; //N窗口数 M黄线内人数 K顾客数 Q查询人数
	cin >> N >> M >> K >> Q;

	vector <int> customer;//顾客所用时间
	vector <int> checkList;//查询列表
	queue <int> *win = new queue <int>[N];//窗口队列


	int temp;
	for (int i = 0; i < K; i++) {
		cin >> temp;
		customer.push_back(temp);
	}

	for (int i = 0; i < Q; i++) {
		cin >> temp;
		checkList.push_back(temp -1); //归0
	}

	int * time = new int[K]; //第K个顾客服务完成时间
	int * timeIn = new int[K];//服务时间
	int * winTime = new int[N];//窗口计时

	for (int i = 0; i < N; i++) {
		winTime[i] = 0;
	}

	for (int i = 0; i < K; i++) {
		timeIn[i] = 0;
		time[i] = 0;
	}
	

	


	for (int i = 0; i < K; i++) {		
		
		int tempw = MinTime(win,N);//找最优窗口
		
//		cout << "i: " << i << " win: " <<  tempw << endl;
//		cout << "True " << TrueTime << endl;
		
		if (win[tempw].size() < M)
			win[tempw].push(customer[i]);
		else { //等出队
			tempw = DeQueueTime(win, N);
			win[tempw].push(customer[i]);
		}
	
		
		timeIn[i] = winTime[tempw];
		winTime[tempw] += customer[i];
		time[i] = winTime[tempw];

	}




	for (int i = 0; i < checkList.size(); i++) {
		int tempT = timeIn[checkList[i]];
		if (tempT < 540) {
			printTime(time[checkList[i]]);
		}
		else
		{
			cout << "Sorry" << endl;
		}
	}

	return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值