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

终于过了。。。。。。。。。太感动了。。。。。。。。。(贴一下代码,虽然我已经看不懂了)

Posted by Belldandy at 2012-03-18 22:01:15 on Problem 1025
#include<iostream>
#include<queue>
#include<math.h>
#include<algorithm>
using namespace std;
struct R
{
	int h;
	int m;
	int s;
}room[20][20];
struct ele
{
	int h;
	int m;
	int s;
}elevator[20];
struct qu
{
	int h;
	int m;
	int s;
	int status;
	int room;
	int man;
	int priority;
	qu(int a,int b,int c,int d,int e,int f,int g)
	{
		h=a;
		m=b;
		s=c;
		status=d;
		room=e;
		man=f;
		priority=g;
	}
	friend bool operator<(qu a,qu b)
	{
		if(a.h>b.h)
		{
			return true;
		}
		if(a.h<b.h)
		{
			return false;
		}
		if(a.m>b.m)
		{
			return true;
		}
		if(a.m<b.m)
		{
			return false;
		}
		if(a.s>b.s)
		{
			return true;
		}
		if(a.s<b.s)
		{
			return false;
		}
		if(a.priority>b.priority)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
};
struct one
{
	int room;
	int time;
}q2[30][1000];
struct p
{
	int h1;
	int m1;
	int s1;
	int h2;
	int m2;
	int s2;
	int room1;
	int room2;
	int status;
}q[30][10000];
struct sor
{
	int num;
	int priority;
	friend bool cmp(struct sor a,struct sor b)
	{
		return a.priority<b.priority;
	}
};
priority_queue<struct qu,vector<qu>>q1;
void add(int &h,int &m,int &s,int length)
{
	s+=length;
	if(s>=60)
	{
		m+=s/60;
		s=s%60;
		if(m>60)
		{
			h+=m/60;
			m=m%60;
		}
	}
	return;
}
void print1(int n,int leng)
{
	int x=0;
	if(leng==2)
	{
		x=10;
	}
	else
	{
		x=1000;
	}
	if(n<x)
	{
		printf("0%d",n);
	}
	else
	{
		printf("%d",n);
	}
	return;
}
void print(int x,int n)
{
	int i=0;
	for(i=0;i<n;i++)
	{
		print1(q[x][i].h1,2);printf(":");print1(q[x][i].m1,2);printf(":");print1(q[x][i].s1,2);printf(" ");
		print1(q[x][i].h2,2);printf(":");print1(q[x][i].m2,2);printf(":");print1(q[x][i].s2,2);printf(" ");
		switch(q[x][i].status)
		{
		case 0:printf("Entry\n");break;
		case 1:printf("Stay in room ");
			print1(q[x][i].room1,4);printf("\n");break;
		case 2:printf("Transfer from room ");
			print1(q[x][i].room2,4);printf(" to room ");print1(q[x][i].room1,4);printf("\n");break;
		case 3:printf("Transfer from room ");
			print1(q[x][i].room1,4);printf(" to elevator\n");break;
		case 4:printf("Stay in elevator\n");break;
		case 5:printf("Transfer from elevator to room ");print1(q[x][i].room1,4);printf("\n");break;
		case 6:printf("Waiting in front of room ");print1(q[x][i].room1,4);printf("\n");break;
		case 7:printf("Waiting in elevator queue\n");break;
		case 8:printf("Exit\n");
		}
	}
	return ;
}
void transfer(int man,int nroom[],int length[],int &h,int &m,int &s)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].h2=q[man][length[man]].h1;
	q[man][length[man]].m2=q[man][length[man]].m1;
	q[man][length[man]].s2=q[man][length[man]].s1;
	add(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,10);
	q[man][length[man]].room1=q1.top().room;
	q[man][length[man]].room2=nroom[man];
	nroom[man]=q1.top().room;
	q[man][length[man]].status=2;
	h=q[man][length[man]].h2;
	m=q[man][length[man]].m2;
	s=q[man][length[man]].s2;
	length[man]++;
	return ;
}
void inroom(int man,int ha1,int ha2,int nroom[],int length[],int now[],int len[],int h,int m,int s)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].h2=q[man][length[man]].h1;
	q[man][length[man]].m2=q[man][length[man]].m1;
	q[man][length[man]].s2=q[man][length[man]].s1;
	add(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,q2[man][now[man]++].time);
	q[man][length[man]].room1=q1.top().room;
	q[man][length[man]].status=1;
	room[ha1][ha2].h=q[man][length[man]].h2;
	room[ha1][ha2].m=q[man][length[man]].m2;
	room[ha1][ha2].s=q[man][length[man]].s2;
	nroom[man]=q1.top().room;
	if(now[man]<len[man])
	{
		q1.push(qu(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,1,q2[man][now[man]].room,man,q1.top().priority));
	}
	else
	{
		q1.push(qu(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,5,q1.top().room,q1.top().man,q1.top().priority));
	}
	length[man]++;
	return;
}
void transfere(int man,int length[],int ha1,int ha2,int &h,int &m,int &s)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].h2=q[man][length[man]].h1;
	q[man][length[man]].m2=q[man][length[man]].m1;
	q[man][length[man]].s2=q[man][length[man]].s1;
	add(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,30*abs(ha1-ha2));
	elevator[ha1].h=h;
	elevator[ha1].m=m;
	elevator[ha1].s=s;
	h=q[man][length[man]].h2;
	m=q[man][length[man]].m2;
	s=q[man][length[man]].s2;
	q[man][length[man]].status=4;
	length[man]++;
	return ;
}
void waite1(int man,int length[],int &h,int &m,int &s)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].status=7;
	return ;
}
void waite2(int man,int ha1,int length[],int &h,int &m,int &s)
{
	q[man][length[man]].h2=h;
	q[man][length[man]].m2=m;
	q[man][length[man]].s2=s;
	elevator[ha1].h=h;
	elevator[ha1].m=m;
	elevator[ha1].s=s;
	length[man]++;
	return;
}
void rtoe(int man,int length[],int room,int &h,int &m,int &s)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].h2=q[man][length[man]].h1;
	q[man][length[man]].m2=q[man][length[man]].m1;
	q[man][length[man]].s2=q[man][length[man]].s1;
	add(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,10);
	h=q[man][length[man]].h2;
	m=q[man][length[man]].m2;
	s=q[man][length[man]].s2;
	q[man][length[man]].room1=room;
	q[man][length[man]].status=3;
	length[man]++;
	return ;
}
void etor(int man,int length[],int &h,int &m,int &s,int room)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].h2=q[man][length[man]].h1;
	q[man][length[man]].m2=q[man][length[man]].m1;
	q[man][length[man]].s2=q[man][length[man]].s1;
	add(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,10);
	h=q[man][length[man]].h2;
	m=q[man][length[man]].m2;
	s=q[man][length[man]].s2;
	q[man][length[man]].room1=room;
	q[man][length[man]].status=5;
	length[man]++;
	return ;
}
void waitr1(int man,int length[],int &h,int &m,int &s,int room)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].status=6;
	q[man][length[man]].room1=room;
	return ;
}
void waitr2(int man,int length[],int &h,int &m,int &s)
{
	q[man][length[man]].h2=h;
	q[man][length[man]].m2=m;
	q[man][length[man]].s2=s;
	length[man]++;
	return;
}
void Exit(int man,int length[],int &h,int &m,int &s)
{
	q[man][length[man]].h1=h;
	q[man][length[man]].m1=m;
	q[man][length[man]].s1=s;
	q[man][length[man]].h2=q[man][length[man]].h1;
	q[man][length[man]].m2=q[man][length[man]].m1;
	q[man][length[man]].s2=q[man][length[man]].s1;
	add(q[man][length[man]].h2,q[man][length[man]].m2,q[man][length[man]].s2,30);
	h=q[man][length[man]].h2;
	m=q[man][length[man]].m2;
	s=q[man][length[man]].s2;
	q[man][length[man]].status=8;
	length[man]++;
	return ;
}
int main()
{
	int i=0,n=0,h,m,s;
	char man1[30]={0};
	int length[30]={0};
	int now[30]={0};
	int len[30]={0};
	int time[3]={0};
	int nroom[30]={0};

	//freopen("1.txt","w",stdout);
	while(scanf("%c",&man1[n])&&man1[n]!='.')
	{
		scanf("%d:%d:%d\n",&h,&m,&s);
		time[0]=h;time[1]=m;time[2]=s;
		add(time[0],time[1],time[2],30);
		q[n][0].h1=h;q[n][0].m1=m;q[n][0].s1=s;q[n][0].h2=time[0],q[n][0].m2=time[1],q[n][0].s2=time[2];length[n]++;
		while(scanf("%d",&h)&&h)
		{
			scanf("%d",&m);
			q2[n][len[n]].room=h;
			q2[n][len[n]++].time=m;
		}
		getchar();
		nroom[n]=100+q2[n][0].room%100;
		if(len[n])
		{
			q1.push(qu(time[0],time[1],time[2],1,q2[n][0].room,n,man1[n]-'A'));
		}
		n++;
	}
	while(!q1.empty())
	{
		int ha1=q1.top().room/100,ha2=q1.top().room%100,man=q1.top().man;h=q1.top().h;m=q1.top().m;s=q1.top().s;
		switch(q1.top().status)
		{
		case 1:
			if(ha1!=nroom[man]/100)
			{
				q1.push(qu(q1.top().h,q1.top().m,q1.top().s,2,q1.top().room,q1.top().man,q1.top().priority));
				q1.pop();
				break;
			}
			if(q1.top().room!=nroom[man])
			{
				transfer(man,nroom,length,h,m,s);
			}
			if(room[ha1][ha2].h<h||(room[ha1][ha2].h==h&&room[ha1][ha2].m<m)||(room[ha1][ha2].h==h&&room[ha1][ha2].m==m&&room[ha1][ha2].s<=s))
			{
				inroom(man,ha1,ha2,nroom,length,now,len,h,m,s);
			}
			else
			{
				waitr1(man,length,h,m,s,q1.top().room);
				q1.push(qu(room[ha1][ha2].h,room[ha1][ha2].m,room[ha1][ha2].s,3,q1.top().room,q1.top().man,q1.top().priority));
			}
			q1.pop();
			break;
		case 2:
			if(length[man]!=1)
			{
				rtoe(man,length,nroom[man],h,m,s);
			}
			if((elevator[nroom[man]/100].h!=h||elevator[nroom[man]/100].m!=m||elevator[nroom[man]/100].s!=s)&&q1.top().s%5==0)
			{
				transfere(man,length,nroom[man]/100,ha1,h,m,s);
				etor(man,length,h,m,s,q1.top().room);
				nroom[man]=q1.top().room;
				q1.push(qu(h,m,s,1,q1.top().room,q1.top().man,q1.top().priority));
			}
			else
			{
				waite1(man,length,h,m,s);
				int k=5-s%5;
				add(h,m,s,k);
				q1.push(qu(h,m,s,4,q1.top().room,q1.top().man,q1.top().priority));
			}
			q1.pop();
			break;
		case 3:
			if(room[ha1][ha2].h<h||(room[ha1][ha2].h==h&&room[ha1][ha2].m<m)||(room[ha1][ha2].h==h&&room[ha1][ha2].m==m&&room[ha1][ha2].s<=s))
			{	
				waitr2(man,length,h,m,s);
				inroom(man,ha1,ha2,nroom,length,now,len,h,m,s);
			}
			else
			{
				q1.push(qu(room[ha1][ha2].h,room[ha1][ha2].m,room[ha1][ha2].s,3,q1.top().room,q1.top().man,q1.top().priority));
			}
			q1.pop();
			break;
		case 4:
			if((elevator[nroom[man]/100].h!=h||elevator[nroom[man]/100].m!=m||elevator[nroom[man]/100].s!=s))
			{
				waite2(man,nroom[man]/100,length,h,m,s);
				transfere(man,length,nroom[man]/100,ha1,h,m,s);
				etor(man,length,h,m,s,q1.top().room);
				nroom[man]=q1.top().room;
				q1.push(qu(h,m,s,1,nroom[man],q1.top().man,q1.top().priority));
			}
			else
			{
				add(h,m,s,5);
				q1.push(qu(h,m,s,4,q1.top().room,q1.top().man,q1.top().priority));
			}
			q1.pop();
			break;
		case 5:
			if(ha1!=01)
			{
				rtoe(man,length,nroom[man],h,m,s);
				q1.push(qu(h,m,s,6,q1.top().room,q1.top().man,q1.top().priority));
				q1.pop();
				break;
			}
			else
			{
				Exit(man,length,h,m,s);
				q1.pop();
			}
			break;
		case 6:
			if((elevator[nroom[man]/100].h!=h||elevator[nroom[man]/100].m!=m||elevator[nroom[man]/100].s!=s)&&q1.top().s%5==0)
			{
				transfere(man,length,1,ha1,h,m,s);
				q1.push(qu(h,m,s,5,100,q1.top().man,q1.top().priority));
			}
			else
			{
				waite1(man,length,h,m,s);
				int k=5-s%5;
				add(h,m,s,k);
				q1.push(qu(h,m,s,7,0100,q1.top().man,q1.top().priority));
			}
			q1.pop();
			break;
		case 7:
			waitr2(man,length,h,m,s);
			transfere(man,length,1,nroom[man]/100,h,m,s);
			Exit(man,length,h,m,s);
			q1.pop();
		}
	}
	struct sor sort1[30];
	for(i=0;i<n;i++)
	{
		sort1[i].priority=man1[i]-'A';
		sort1[i].num=i;
	}
	sort(sort1,sort1+n,cmp);
	for(i=0;i<n;i++)
	{
		printf("%c\n",man1[sort1[i].num]);
		print(sort1[i].num,length[sort1[i].num]);
		printf("\n");
	}
}

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