Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

数据过了,提交就是wa

Posted by libee_zz at 2019-07-05 00:48:02 on Problem 1025
In Reply To:搞个测试数据 Posted by:tt0928 at 2011-06-09 17:56:31
#include "stdio.h"
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;
struct Room
{
	bool busy,waitQueue[26];
	int queueLength;
}room[11][11];

struct Visit
{
	int roomNumber, duration;
};

struct ListOfAllAgents
{
	int startTime, listAmount, listCounter;
	vector<Visit> visitList;
}list[26];

struct ActionLog
{
	int actionType, startTime, endTime, startRoomNumber, endRoomNumber;
};


struct Record
{
	vector<ActionLog> actionLog;
	int logCounter;
}record[26];

int init() {
	for (int i = 0; i<26; i++) {
		if (list[i].listAmount == 0)continue;
		ActionLog temp;
		temp.actionType = 1;
		temp.startTime = list[i].startTime;
		temp.endTime = temp.startTime;
		temp.startRoomNumber = 0;
		if (list[i].visitList[0].roomNumber / 100>1)temp.endRoomNumber = 100;
		else temp.endRoomNumber = list[i].visitList[0].roomNumber;
		record[i].actionLog.push_back(temp);
	}
	return 0;
}
int entry(int id) {
	record[id].actionLog[record[id].logCounter].endTime += 30;

	room[list[id].visitList[0].roomNumber / 100][list[id].visitList[0].roomNumber % 100].waitQueue[id] = true;
	room[list[id].visitList[0].roomNumber / 100][list[id].visitList[0].roomNumber % 100].queueLength++;

	ActionLog temp;
	if (list[id].visitList[0].roomNumber / 100>1) {
		temp.actionType = 2;
		temp.startRoomNumber = 100;
		temp.endRoomNumber = 100;
	}
	else {
		temp.actionType = 3;
		temp.startRoomNumber = list[id].visitList[0].roomNumber;
		temp.endRoomNumber = list[id].visitList[0].roomNumber;
	}
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;
	record[id].actionLog.push_back(temp);
	record[id].logCounter++;
	return 0;
}
int waitElevator(int id) {
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].queueLength++;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[id] = true;
	if (record[id].actionLog[record[id].logCounter].endTime % 5) {
		record[id].actionLog[record[id].logCounter].endTime = record[id].actionLog[record[id].logCounter].endTime / 5 * 5 + 5;
	}


	ActionLog temp;
	temp.actionType = 8;
	temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
	if (list[id].listCounter >= list[id].listAmount)temp.endRoomNumber = 100;
	else temp.endRoomNumber = list[id].visitList[list[id].listCounter].roomNumber/100*100;
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;

	if (record[id].actionLog[record[id].logCounter].endTime == record[id].actionLog[record[id].logCounter].startTime) {

		record[id].actionLog[record[id].logCounter] = temp;
	}
	else
	{
		record[id].actionLog.push_back(temp);
		record[id].logCounter++;
	}

	return 0;
}
int waitRoom(int id) {
	room[record[id].actionLog[record[id].logCounter].endRoomNumber / 100][record[id].actionLog[record[id].logCounter].endRoomNumber % 100].queueLength++;
	room[record[id].actionLog[record[id].logCounter].endRoomNumber / 100][record[id].actionLog[record[id].logCounter].endRoomNumber % 100].waitQueue[id] = true;
	if (room[record[id].actionLog[record[id].logCounter].endRoomNumber / 100][record[id].actionLog[record[id].logCounter].endRoomNumber % 100].busy) {
		for (int i = 0; i < 26; i++) {
			if (room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[i] == false)continue;
			record[i].actionLog[record[i].logCounter].endTime = 24*3600;
		}
		return 0;
	}

	ActionLog temp;
	temp.actionType = 7;
	temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
	temp.endRoomNumber = temp.startRoomNumber;
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;
	
	if (record[id].actionLog[record[id].logCounter].endTime == record[id].actionLog[record[id].logCounter].startTime) {

		record[id].actionLog[record[id].logCounter] = temp;
	}
	else
	{
		record[id].actionLog.push_back(temp);
		record[id].logCounter++;
	}
	return 0;
}

int roomToRoom(int id) {
	record[id].actionLog[record[id].logCounter].endTime += 10;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].busy = false;
	for (int i = 0; i < 26; i++) {
		if (room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[i] == false)continue;
		record[i].actionLog[record[i].logCounter].endTime = record[id].actionLog[record[id].logCounter].startTime;
	}

	ActionLog temp;
	temp.actionType = 3;
	temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
	temp.endRoomNumber = temp.startRoomNumber;
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;

	record[id].actionLog.push_back(temp);
	record[id].logCounter++;
	return 0;
}

int elevatorToRoom(int id) {
	record[id].actionLog[record[id].logCounter].endTime += 10;

	ActionLog temp;
	temp.actionType = 3;
	temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
	temp.endRoomNumber = temp.startRoomNumber;
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;

	record[id].actionLog.push_back(temp);
	record[id].logCounter++;
	return 0;
}

int roomToElevator(int id) {
	record[id].actionLog[record[id].logCounter].endTime += 10;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].busy = false;
	for (int i = 0; i < 26; i++) {
		if (room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[i] == false)continue;
		record[i].actionLog[record[i].logCounter].endTime = record[id].actionLog[record[id].logCounter].startTime;
	}

	ActionLog temp;
	temp.actionType = 2;
	temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
	temp.endRoomNumber = temp.startRoomNumber;
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;

	room[temp.startRoomNumber / 100][temp.startRoomNumber % 100].queueLength++;
	room[temp.startRoomNumber / 100][temp.startRoomNumber % 100].waitQueue[id] = true;

	record[id].actionLog.push_back(temp);
	record[id].logCounter++;
	return 0;
}

int inRoom(int id) {
	record[id].actionLog[record[id].logCounter].endTime += list[id].visitList[list[id].listCounter].duration;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].queueLength--;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].busy = true;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[id] = false;

	ActionLog temp;
	if (list[id].listCounter + 1 >= list[id].listAmount) {
		if (list[id].visitList[list[id].listCounter].roomNumber / 100 == 1) {
			temp.actionType = 9;
			temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
			temp.endRoomNumber = 0;
		}
		else {
			temp.actionType = 6;
			temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
			temp.endRoomNumber = temp.startRoomNumber / 100 * 100;
		}
	}
	else if (list[id].visitList[list[id].listCounter].roomNumber / 100 != list[id].visitList[list[id].listCounter + 1].roomNumber / 100) {
		temp.actionType = 6;
		temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
		temp.endRoomNumber = temp.startRoomNumber / 100 * 100;
	}
	else {
		temp.actionType = 4;
		temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
		temp.endRoomNumber = list[id].visitList[list[id].listCounter + 1].roomNumber;
	}
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;
	if (temp.actionType == 9)temp.endTime += 30;

	list[id].listCounter++;

	record[id].actionLog.push_back(temp);
	record[id].logCounter++;
	return 0;
}
int inElevator(int id) {
	int time = (record[id].actionLog[record[id].logCounter].startRoomNumber / 100 - record[id].actionLog[record[id].logCounter].endRoomNumber / 100) * 30;
	if (time<0)time = -time;
	record[id].actionLog[record[id].logCounter].endTime += time;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].queueLength--;
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[id] = false;
	if (room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].queueLength > 0) {
		for (int i = 0; i < 26; i++) {
			if (room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[i] == false)continue;
			record[i].actionLog[record[i].logCounter].endTime = record[id].actionLog[record[id].logCounter].startTime + 5;
		}
	}
	ActionLog temp;
	if (list[id].listCounter>=list[id].listAmount) {
		temp.actionType = 9;
		temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
		temp.endRoomNumber = 100;
	}
	else {
		temp.actionType = 5;
		temp.startRoomNumber = record[id].actionLog[record[id].logCounter].endRoomNumber;
		temp.endRoomNumber = list[id].visitList[list[id].listCounter].roomNumber;
	}
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;
	if (temp.actionType == 9)temp.endTime += 30;
	record[id].actionLog.push_back(temp);
	record[id].logCounter++;
	
	return 0;
}
int exitBuilding(int id) {
	room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].busy = false;
	for (int i = 0; i < 26; i++) {
		if (room[record[id].actionLog[record[id].logCounter].startRoomNumber / 100][record[id].actionLog[record[id].logCounter].startRoomNumber % 100].waitQueue[i] == false)continue;
		record[i].actionLog[record[i].logCounter].endTime = record[id].actionLog[record[id].logCounter].startTime;
	}

	ActionLog temp;
	temp.actionType = 10;
	temp.startTime = record[id].actionLog[record[id].logCounter].endTime;
	temp.endTime = temp.startTime;
	temp.startRoomNumber = 0;
	temp.endRoomNumber = 0;
	record[id].actionLog.push_back(temp);
	record[id].logCounter++;
	return 0;
}
int cacul() {
	while (1) {
		int earliestTime = 24 * 3600, id = 26;
		for (int i = 0; i<26; i++) {
			if (list[i].listAmount == 0)continue;
			if (record[i].actionLog[record[i].logCounter].actionType == 10)continue;
			if (record[i].actionLog[record[i].logCounter].endTime<earliestTime) {
				earliestTime = record[i].actionLog[record[i].logCounter].endTime;
				id = i;
			}
		}
		if (id == 26)return 0;
		switch (record[id].actionLog[record[id].logCounter].actionType)
		{
		case 1:
			entry(id);
			break;
		case 2:
			waitElevator(id);
			break;
		case 3:
			waitRoom(id);
			break;
		case 4:
			roomToRoom(id);
			break;
		case 5:
			elevatorToRoom(id);
			break;
		case 6:
			roomToElevator(id);
			break;
		case 7:
			inRoom(id);
			break;
		case 8:
			inElevator(id);
			break;
		case 9:
			exitBuilding(id);
			break;
		default:
			break;
		}
	}
	return 0;
}
int output() {
	for (int i = 0; i<26; i++) {
		if (record[i].logCounter == 0)continue;
		printf("\n%c\n", i + 'A');
		for (int j = 0; j<record[i].logCounter; j++) {
			int s = record[i].actionLog[j].startTime, e = record[i].actionLog[j].endTime;
			printf("%d%d:%d%d:%d%d %d%d:%d%d:%d%d ", s/3600/10, s / 3600%10, s / 60 % 60/10, s / 60 % 60%10, s % 60/10, s % 60%10, e / 3600/10, e / 3600%10, e / 60 % 60/10, e / 60 % 60%10, e % 60/10, e % 60%10);
			s = record[i].actionLog[j].startRoomNumber;
			e = record[i].actionLog[j].endRoomNumber;
			switch (record[i].actionLog[j].actionType)
			{
			case 1:
				printf("Entry");
				break;
			case 2:
				printf("Waiting in elevator queue");
				break;
			case 3:
				printf("Waiting in front of room %d%d%d%d", s / 1000, s / 100 % 10, s / 10 % 10, s % 10);
				break;
			case 4:
				printf("Transfer from room %d%d%d%d to room %d%d%d%d", s / 1000, s / 100 % 10, s / 10 % 10, s % 10, e / 1000, e / 100 % 10, e / 10 % 10, e % 10);
				break;
			case 5:
				printf("Transfer from elevator to room %d%d%d%d", e / 1000, e / 100 % 10, e / 10 % 10, e % 10);
				break;
			case 6:
				printf("Transfer from room %d%d%d%d to elevator", s / 1000, s / 100 % 10, s / 10 % 10, s % 10);
				break;
			case 7:
				printf("Stay in room %d%d%d%d", s / 1000, s / 100 % 10, s / 10 % 10, s % 10);
				break;
			case 8:
				printf("Stay in elevator");
				break;
			case 9:
				printf("Exit");
				break;
			default:
				break;
			}
			printf("\n");
		}

	}
	return 0;
}

int main() {
	char agent;
	memset(list, 0, sizeof(list));
	memset(record, 0, sizeof(record));
	memset(room, 0, sizeof(room));
	//输入部分
	while (scanf_s("%c", &agent,1) != EOF)
	{
		if (agent == '.')break;
		int h, m, s;
		scanf_s("%d:%d:%d", &h, &m, &s);
		list[agent - 'A'].startTime = h * 3600 + m * 60 + s;
		int r, d;
		while (scanf_s("%d", &r) != EOF) {
			if (r == 0) {
				getchar();
				break;
			}
			Visit temp;
			scanf_s("%d", &d);
			temp.roomNumber = r;
			temp.duration = d;
			list[agent - 'A'].visitList.push_back(temp);
			list[agent - 'A'].listAmount++;
		}

	}
	//初始化
	init();

	//计算部分
	cacul();
	//输出部分
	output();

	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator