河南省第十屆ACM省賽題目:問題 H: Intelligent Parking Building(模擬)
阿新 • • 發佈:2019-02-04
問題 H: Intelligent Parking Building
停車場業務發生了一場新的革命:停車樓。這個概念很簡單:你把你的車開進大樓入口處的電梯,電梯和傳送帶將車拖到一個空的停車位,車停留在那裡,直到你拿起它。當您返回時,電梯和傳送帶將您的汽車移回入口,您就完成了。
建築物的佈局很簡單。有一臺中央電梯可以在不同樓層之間運輸汽車。每層樓上都有一條巨大的圓形傳送帶,汽車站在上面。該皮帶可以順時針和逆時針方向移動。當電梯到達地面時,它成為皮帶的一部分,以便汽車可以穿過它。
在一天結束的時候,建築物通常會擠滿汽車,很多人會來接他們。客戶按照先來先服務的順序進行處理:電梯移動到第一輛車的地板上,傳送帶在電梯上移動轎廂,電梯再次下移,依此類推。我們想知道最後一位顧客拿到他的車之前需要多長時間。向上或向下移動電梯一層需要
輸入
在第一行中,一個正數:測試用例的數量,最多30個。每個測試用例指定:
兩個整數h和l,1≤h≤50和2≤l≤50:停車塔的高度和傳送帶的長度。
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; }