1. 程式人生 > >河南省第十屆ACM省賽題目:問題 H: Intelligent Parking Building(模擬)

河南省第十屆ACM省賽題目:問題 H: Intelligent Parking Building(模擬)

問題 H: Intelligent Parking Building

停車場業務發生了一場新的革命:停車樓。這個概念很簡單:你把你的車開進大樓入口處的電梯,電梯和傳送帶將車拖到一個空的停車位,車停留在那裡,直到你拿起它。當您返回時,電梯和傳送帶將您的汽車移回入口,您就完成了。

建築物的佈局很簡單。有一臺中央電梯可以在不同樓層之間運輸汽車。每層樓上都有一條巨大的圓形傳送帶,汽車站在上面。該皮帶可以順時​​針和逆時針方向移動。當電梯到達地面時,它成為皮帶的一部分,以便汽車可以穿過它。

在一天結束的時候,建築物通常會擠滿汽車,很多人會來接他們。客戶按照先來先服務的順序進行處理:電梯移動到第一輛車的地板上,傳送帶在電梯上移動轎廂,電梯再次下移,依此類推。我們想知道最後一位顧客拿到他的車之前需要多長時間。向上或向下移動電梯一層需要

10秒鐘,並且將傳送帶沿任一方向移動一個位置需要5秒鐘。

輸入

在第一行中,一個正數:測試用例的數量,最多30個。每個測試用例指定:

兩個整數hl1h502l50:停車塔的高度和傳送帶的長度。

l整數的h行:汽車的初始位置。第i行的第j個數字描述了第i層的第j個位置。如果位置為空,則此數字為-1;如果位置由第三輛汽車佔用,則為r。正數形成從1到汽車數量的連續序列。入口位於一樓,電梯(最初為空)位於第一個位置。停車場至少有一輛車。

輸出

對於每個測試用例,都會生成一行,其中包含一個整數,該整數是最後一位客戶服務之前的秒數。

樣例輸入

3
1  5
1  -1  -1  -1  2 
1  5
2  -1  -1  -1  1 
3 6
-1  5  6  -1  -1  3
-1  -1  7  -1  2  9
-1  10  4  1  8  -1

樣例輸出

5
10
320

#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
int mat[55][55];
struct node{
	int hang;//標記樓層 
	int lie;//車位號 
}car[3050]; 
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m;
		int maxn=0;//car數 
		memset(mat,-1,sizeof(mat));
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		{
			//[0]相當於電梯位 mat[i][0]:存放第i層之前出去的車位號
			mat[i][0]=1; 
			for(int j=1;j<=m;j++)
			{
				scanf("%d",&mat[i][j]);
				if(mat[i][j]!=-1)
				{
					car[mat[i][j]].hang=i;
					car[mat[i][j]].lie=j;
					if(mat[i][j]>maxn)
					{
						maxn=mat[i][j];
					}
				}
			}
		}
		int sum=0;
		for(int i=1;i<=maxn;i++)
		{
			int row = car[i].hang;
			int place = car[i].lie;
			sum+=(2*(row-1)*10);//汽車上下樓的時間 
			int smooth=fabs(place-mat[row][0]);//順時針移動的格數
			int inverse=m-smooth;//逆時針移動的格數 
			int other=smooth<inverse?smooth:inverse;//選擇移動方式 
			sum+=(other*5);
			mat[row][0]=place;//當前row層出去的車位號是place
		}
		printf("%d\n",sum);
	}
	return 0; 
}