3505 Tower Parking

問題概要

h階建で、各フロアにl台の駐車スペースのある駐車場がある。
それぞれのスペースに止まっている車が、何番目に出るかが与えられる。
ただしスペースが空の時は-1が与えられる。


このとき、全ての車が駐車場から出るまでにかかる時間を求めよ。
車は以下のようにして出る。
垂直方向にはエレベータを使って移動する。一階分の距離を移動するのに10秒かかる。
同じ階ではベルトコンベアを使って移動する。コンベアは時計回りまたは反時計回りに動き、車一台分の距離を移動するのに5秒かかる。
車はエレベータの位置(0番目)までコンベアで運ばれた後、即座にエレベータに乗るものとする。


車の台数は100台以下、h,l≦50を満たす。

解法

条件にしたがってシミュレーションすればよい。特に工夫は必要ない。


エレベータは1階とを往復するので(階-1)*20秒かかることに注意する。
コンベアは両方向に回るので、近いほうに回す。回すのにはSTLのrotateが便利。

ソースコード

int T,h,l,c[50][50];

int main(){
	scanf("%d",&T);
	rep(U,T){
		scanf("%d%d",&h,&l);
		rep(i,h)rep(j,l)scanf("%d",c[i]+j);
		
		int ans=0,n=1;
		for(;;n++){
			int y,x;
			for(y=0;y<h;y++)for(x=0;x<l;x++)if(c[y][x]==n)goto OUT;
			OUT:if(y==h)break;
			
			c[y][x]=-1;
			ans+=y*20+min(x,l-x)*5;
			rotate(c[y],c[y]+x,c[y]+l);
		}
		printf("%d\n",ans);
	}
	return 0;
}