栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

PAT甲级 1026(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PAT甲级 1026(C++)

记录一下个人遇到的错误点:

1、play_time最大为2h

2、servetime>=13*3600 的都不予办理

3、当vip pair到达时,若有多个空闲的桌子,优先选择其中的vip桌

#include
#include
#include
#include
using namespace std;
struct pairs{   
	int play_time = 0;
	int arrive = 0;
	int serve = 0;
	int vip = 0;
	int isvisited = 0;
};
struct table {
	int vip = 0;
	int count = 0;
	int endtime = 0;
};
bool compareArrive(struct pairs p1, struct pairs p2) {
	return p1.arrive< p2.arrive;
}
bool compareServe(struct pairs p1, struct pairs p2) {
	return p1.serve < p2.serve;
}
vector info;
vector t;
int findNextVIP(int i,int N) {
	int index;
	for (int j = i; j < N; j++) {
		if (info[j].vip == 1 && info[j].isvisited==0)
			return j;
	}
	return -1;
}
int findFirstTable(int K) {
	int min = t[1].endtime; int index = 1;
	for (int i = 2; i <= K; i++) {
		if (t[i].endtime < min) {
			min = t[i].endtime;
			index = i;
		}
	}
	return index;
}
void allocate(int p_index, int t_index) {
	int flag = 1;
	info[p_index].isvisited = 1;
	if (info[p_index].arrive < t[t_index].endtime)
	{
		info[p_index].serve = t[t_index].endtime;
		t[t_index].endtime += info[p_index].play_time*60;
	}
	else {
		if (info[p_index].vip == 1) {
			int k;
			for (k = 1; k <= t.size(); k++) {
				if (info[p_index].arrive >= t[k].endtime && t[k].vip == 1)
					break;
			}
			if (k != t.size() + 1) {
				t_index = k; flag = 0;
			}
		}
		if (flag == 1) {
			for (int k = 1; k <= t.size(); k++) {
				if (info[p_index].arrive > t[k].endtime)
				{
					t_index = k; break;
				}
			}
		}
		info[p_index].serve = info[p_index].arrive;
		t[t_index].endtime = info[p_index].serve + info[p_index].play_time*60;
	}
	if(info[p_index].serve<13*3600)
		t[t_index].count++;
}
int main() {
	int N; cin >> N;
	info.resize(N);
	for (int i = 0; i < N; i++) {
		int h, m, s;
		scanf("%02d:%02d:%02d", &h, &m, &s);
		cin >> info[i].play_time;
		if (info[i].play_time > 2 * 60) info[i].play_time = 2 * 60;
		cin >> info[i].vip;
		info[i].arrive = h * 3600 + m*60 + s-8*3600;
	}
	int K, M;cin >> K >> M;
	t.resize(K+1);
	for (int i = 1; i <= M; i++) {
		int temp; cin >> temp;
		t[temp].vip  = 1;
	}
	sort(info.begin(), info.end(), compareArrive);
	for (int i = 0; i < N; i++) {
		if (info[i].isvisited == 1)
			continue;
		while (info[i].isvisited == 0) {
			int m = findFirstTable(K);
			if (t[m].vip == 1) {
				int v = findNextVIP(i, N);
				if (v == -1) { allocate(i, m); continue; }
				if (info[v].arrive <= t[m].endtime) allocate(v, m);
				else allocate(i, m);
			}
			else allocate(i, m);
		}
	}
	sort(info.begin(), info.end(), compareServe);
	for (int i = 0; i < N; i++) {
		if (info[i].serve >= 13 * 3600) break;
		int h, m, s; h = info[i].arrive / 3600;
		m = (info[i].arrive - h * 3600) / 60;
		s = info[i].arrive % 60;
		printf("%02d:%02d:%02d ", h + 8, m, s);
		h = info[i].serve / 3600;
		m = (info[i].serve - h * 3600) / 60;
		s = info[i].serve % 60;
		printf("%02d:%02d:%02d ", h + 8, m, s);
		int wait = info[i].serve - info[i].arrive;
		wait = (wait % 60 >= 30) ? wait / 60 + 1 : wait / 60;
		cout << wait << endl;
	}
	for (int i = 1; i <= K; i++) {
		cout << t[i].count;
		if (i != K) cout << " ";
	}
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/317351.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号