AOJ0192 Tsuruga Parking
問題リンク Tsuruga Parking
- 解法
重いシミュレート問題です。定義を読んで根気強く実装するしかないと思います。
駐車場の状態を配列で作っておき、そこに車があと何分停車しているかを入れておきます。0は空車を表すことにします。
これを使って1分毎にシミュレートする感じです。
- ソース
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Scanner; //Tsuruga Parking public class AOJ0192 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true){ int m = sc.nextInt(); int n = sc.nextInt(); if((m|n)==0)break; int[] t = new int[n+1]; for(int i=1;i<=n;i++)t[i]=sc.nextInt(); int[][] p = new int[m][2]; List<Integer> ans = new ArrayList<Integer>(); Queue<Integer> q = new LinkedList<Integer>(); int r = 10; while(ans.size()<n){ if(r%10==0&&1<=r/10&&r/10<=n)q.add(r/10); for(int i=0;i<m;i++)for(int j=0;j<2;j++)if(p[i][j]>0)t[p[i][j]]--; for(int i=0;i<m;i++){ if(p[i][0]>0&&t[p[i][0]]<=0){ ans.add(p[i][0]); p[i][0] = p[i][1]; p[i][1] = 0; if(p[i][0]>0&&t[p[i][0]]<=0){ ans.add(p[i][0]); p[i][0] = 0; } } } boolean f = true; while(!q.isEmpty()&&f){ f = false; int dmin = Integer.MAX_VALUE; int umin = Integer.MAX_VALUE; int d = -1; int u = -1; for(int i=0;i<m;i++){ if(p[i][0]==0){ f = true; p[i][0] = q.poll(); break; } else if(p[i][1]==0){ if(t[p[i][0]]>=t[q.peek()]){ if(t[p[i][0]]-t[q.peek()] < umin){ umin = t[p[i][0]]-t[q.peek()]; u = i; } } else{ if(t[q.peek()]-t[p[i][0]] < dmin){ dmin = t[q.peek()]-t[p[i][0]]; d = i; } } } } if(f)continue; if(u>=0){ p[u][1] = p[u][0]; p[u][0] = q.poll(); f = true; } else if(d>=0){ p[d][1] = p[d][0]; p[d][0] = q.poll(); f = true; } } r++; } for(int i=0;i<n;i++){ if(i>0)System.out.print(" "); System.out.print(ans.get(i)); } System.out.println(); } } }