首页 > 学院 > 开发设计 > 正文

1026. Table Tennis 解析

2019-11-11 03:49:16
字体:
来源:转载
供稿:网友

你们尽管看我的程序,看得懂的算我输!!! (我自己都看不懂了......)

这个排队好麻烦。

我是按桌子来分类的。

1、Vip桌可用 :有人等待,有VIP先给VIP,没有给队列最前面的人。

没有人等待,给队列最前面的人。

2、普通桌可用:按顺序来。

3、VIP桌和普通桌都可以用:有人等待,有VIP先给VIP分配VIP桌,没有VIP给队列最前的人。优先号小的桌子

    没人等待,给队列最前面的人。优先号小的桌子。

(但愿逻辑没错吧,我也乱了_(:з)∠)_)

#include <iostream>#include <string>#include <vector>#include <algorithm>#include <climits>#include <queue>#define MAX 10010#define MAX2 110#define EndTime 75600using namespace std;int N;int Table, VipTable;int ServeCount;//服务人数计数vector <int> Vipnum;struct Node{	string arrive;	int arriveTime;	int time;	int tag;	int serveTime;	int waitTime;	bool isServe;	int TabNum;};Node c[MAX];struct Tab {	int Num;	int time;	int count;};vector <Tab> t; // 普通vector <Tab> tv;// VIPint c2int(char c){	return int(c - '0');}int str2int(string s){	int sum = 0;	sum	+= 3600 * (c2int(s[0]) * 10 + c2int(s[1]));	sum += 60 * (c2int(s[3]) * 10 + c2int(s[4]));	sum += c2int(s[6]) * 10 + c2int(s[7]);	return sum;}bool cmp(Node n1, Node n2) {	return str2int(n1.arrive) < str2int(n2.arrive);}bool cmp2(Tab t1, Tab t2) {	return t1.Num < t2.Num;}bool cmp3(Node n1, Node n2) {	return n1.serveTime < n2.serveTime;}int MinVipTab() {	int ti = -1, min = INT_MAX;	for (int i = 0; i < tv.size(); i++) {		if (min > tv[i].time) {			min = tv[i].time;			ti = i;		}	}	return ti;}int MinTab() {	int ti = -1, min = INT_MAX;	for (int i = 0; i < t.size(); i++) {		if (min > t[i].time) {			min = t[i].time;			ti = i;		}	}	return ti;}void Serve(Node * c) {	int pv = MinVipTab();	int p = MinTab();	int HaveVip = false;	int isFind = false;		int ServeI = 0;	bool st = true, isFindVip = false, isWait = false;	vector <int> NoWait;//不需要等待	vector <int> Wait;//需要等待	if (tv[pv].time < t[p].time) { //VIP桌可用		for (int i = 0; i < N; i++) {			if (!c[i].isServe) {				if (c[i].arriveTime < tv[pv].time) { //要等待					Wait.push_back(i); 					isWait = true;				}				else {					if (isWait) break; // 有需要等待的 必然没有不等待的					else { //不需要等待 则直接用 没有人同时到						NoWait.push_back(i); break;					}									}			}		}		if (Wait.size() != 0) {//有需要等待的 			int ti = Wait[0];			for (int i = 0; i < Wait.size(); i++) {//查找是否有VIP				if (c[Wait[i]].tag == 1) {//					isFindVip = true;					ti = Wait[i];					break;				}			}						c[ti].waitTime = tv[pv].time - c[ti].arriveTime;			c[ti].serveTime = tv[pv].time;			if (c[ti].serveTime < EndTime) {				c[ti].isServe = true;				tv[pv].count++;				c[ti].TabNum = tv[pv].Num;			}			ServeCount--;			tv[pv].time += c[ti].time;		}		else {//不需要等待			int ti = NoWait[0];			c[ti].waitTime = 0;			c[ti].serveTime = c[ti].arriveTime;			tv[pv].time = c[ti].arriveTime;			if (c[ti].serveTime < EndTime) {				c[ti].isServe = true;				tv[pv].count++;				c[ti].TabNum = tv[pv].Num;			}			ServeCount--;			tv[pv].time += c[ti].time;		}	}		else if(tv[pv].time > t[p].time){ //普通桌可用		int ti = 0;		for (int i = 0; i < N; i++) {			if (!c[i].isServe) {				ti = i;				break;			}		}		if (c[ti].arriveTime < t[p].time) { //需要等待			c[ti].waitTime = t[p].time - c[ti].arriveTime;			c[ti].serveTime = t[p].time;			if (c[ti].serveTime < EndTime) {				c[ti].isServe = true;				t[p].count++;				c[ti].TabNum = t[p].Num;			}			ServeCount--;			t[p].time += c[ti].time;		}		else {			c[ti].waitTime = 0;			c[ti].serveTime = c[ti].arriveTime;			t[p].time = c[ti].arriveTime;			if (c[ti].serveTime < EndTime) {				c[ti].isServe = true;				t[p].count++;				c[ti].TabNum = t[p].Num;			}			ServeCount--;			t[p].time += c[ti].time;		}	}	else { //普通桌和VIP桌相同		for (int i = 0; i < N; i++) {			if (!c[i].isServe) {				if (c[i].arriveTime < tv[pv].time) { //要等待					Wait.push_back(i);					isWait = true;				}				else {					if (isWait) break; // 有需要等待的 必然没有不等待的					else { //不需要等待 则直接用 没有人同时到						NoWait.push_back(i); break;					}				}			}		}				if (Wait.size() != 0) {//有需要等待的 			int ti = Wait[0];			for (int i = 0; i < Wait.size(); i++) {//查找是否有VIP				if (c[Wait[i]].tag == 1) {					isFindVip = true;					ti = Wait[i];					break;				}			}			if (isFindVip) {//有vip				c[ti].waitTime = tv[pv].time - c[ti].arriveTime;				c[ti].serveTime = tv[pv].time;				if (c[ti].serveTime < EndTime) {					c[ti].isServe = true;					tv[pv].count++;					c[ti].TabNum = tv[pv].Num;				}				ServeCount--;				tv[pv].time += c[ti].time;			}			else {				c[ti].waitTime = t[p].time - c[ti].arriveTime;				c[ti].serveTime = t[p].time;				if (c[ti].serveTime < EndTime) {					c[ti].isServe = true;					t[p].count++;					c[ti].TabNum = t[p].Num;				}				ServeCount--;				t[p].time += c[ti].time;			}		}		else {//VIP桌和普通桌都能用 选号小的			int ti = NoWait[0];			if (c[ti].tag == 1) {//VIP								c[ti].waitTime = 0;				c[ti].serveTime = c[ti].arriveTime;				tv[pv].time = c[ti].arriveTime;				if (c[ti].serveTime < EndTime) {					c[ti].isServe = true;					tv[pv].count++;					c[ti].TabNum = tv[pv].Num;				}				ServeCount--;				tv[pv].time += c[ti].time;			}			else {				if (tv[pv].Num > t[p].Num) {					c[ti].waitTime = 0;					c[ti].serveTime = c[ti].arriveTime;					t[p].time = c[ti].arriveTime;					if (c[ti].serveTime < EndTime) {						c[ti].isServe = true;						t[p].count++;						c[ti].TabNum = t[p].Num;					}					ServeCount--;					t[p].time += c[ti].time;				}				else {					c[ti].waitTime = 0;					c[ti].serveTime = c[ti].arriveTime;					tv[pv].time = c[ti].arriveTime;					if (c[ti].serveTime < EndTime) {						c[ti].isServe = true;						tv[pv].count++;						c[ti].TabNum = tv[pv].Num;					}					ServeCount--;					tv[pv].time += c[ti].time;				}			}		}	}}void PRintTime(int num) {	int HH;	int MM;	int SS;	HH = num / 3600;	MM = num % 3600 / 60;	SS = num % 3600 % 60;		printf("%02d", HH);	cout << ":";	printf("%02d", MM);	cout << ":";	printf("%02d", SS);}void printMM(int MM){	int isC = MM % 60;	MM /= 60;	if (isC >= 30) MM++;	cout << MM;}int main() {	cin >> N;	ServeCount = N;		for (int i = 0; i < N; i++) {		cin >> c[i].arrive >> c[i].time >> c[i].tag;		if (c[i].time > 120) {			c[i].time = 120;		}		c[i].time *= 60;		c[i].arriveTime = str2int(c[i].arrive);		c[i].isServe = false;/*		if (c[i].arriveTime <= 8 * 3600)			while (1);			*/		}	cin >> Table >> VipTable;			Tab  tempt;	tempt.time = 8*3600;	tempt.count = 0;	for (int i = 0; i < VipTable; i++) {		cin >> tempt.Num;		tempt.Num--;			tv.push_back(tempt);	}	sort(&tv[0], &tv[0] + VipTable, cmp2);	for (int i = 0,j =0; i < Table; i++) {		if (i != tv[j].Num) {			tempt.Num = i;			t.push_back(tempt);		}	}#ifdef _DEBUG	for (int i = 0; i < t.size(); i++) {		cout << t[i].Num << " " << t[i].time << " " << t[i].count << endl;	}	for (int i = 0; i < tv.size(); i++) {		cout << tv[i].Num << " " << tv[i].time << " " << tv[i].count << endl;	}#endif	sort(&c[0], &c[0] + N, cmp);#ifdef _DEBUG	for (int i = 0; i < N; i++) {		cout << c[i].arrive << " " << c[i].time /60 << " "			<< str2int(c[i].arrive) << " ";		if (c[i].tag == 1)			cout << " VIP ";		else			cout << " NoV ";		cout << endl;	}#endif	//for (int i = 0; i < N; i++) {	//	Serve(c[i]);	//}	while (ServeCount) {		Serve(c);	}	sort(&c[0], &c[0] + N, cmp3);	for (int i = 0; i < N; i++) {		if (c[i].isServe) {			cout << c[i].arrive << " ";			printTime(c[i].serveTime);			cout << " ";			printMM(c[i].waitTime);	#ifdef _DEBUG			cout << " " << c[i].TabNum + 1;			if (c[i].tag == 1)				cout << " VIP ";			else				cout << " NoV ";#endif			cout << endl;		}	}	vector <Tab> golbeT;	for (int i = 0; i < tv.size(); i++) {		golbeT.push_back(tv[i]);	}	for (int i = 0; i < t.size(); i++) {		golbeT.push_back(t[i]);	}	sort(&golbeT[0], &golbeT[0] + Table, cmp2);	for (int i = 0; i < Table -1 ; i++) {		cout << golbeT[i].count << " ";	}	cout << golbeT[Table - 1].count << endl;	system("pause");	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表