Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2011-05-08

A. Bot Trust

22:59 |  A. Bot Trust - kojingharangの日記 を含むブックマーク はてなブックマーク -  A. Bot Trust - kojingharangの日記  A. Bot Trust - kojingharangの日記 のブックマークコメント

  • 廊下があって等間隔に1,2,3...のボタンが置いてある。
  • ロボット2台が廊下の1ボタンのところに置いてある。
  • それぞれのロボットは毎秒ごとに (1) +1方向または−1方向に1マス移動する、(2)移動しない、(3)今いるところのボタンを押す、のいづれかができる。
  • 「ボタンの番号と押すロボットの名前」からなるリストが与えられるので、指定されたロボットが指定された番号のボタンをリストの順に押す。
  • 全部押すまでに何秒かかるか。
  • ロボットが押すべきボタンの位置と、全体として何番目にそのボタンを押すことになるかを各ロボット分のリストに用意する。
  • ロボットがボタンを押せる位置にある かつ ボタン順番値==グローバルなボタンカウンタ ならボタンを押す。
int main()
{
	int T;
	cin>>T;
	//cout<<T<<endl;
	REP(t, T)
	{
		int ans = 0;
		VVI d;
		d.PB(VI());
		d.PB(VI());
		
		int N;
		cin>>N;
		
		REP(i, N)
		{
			char col;
			int loc;
			cin>>col>>loc;
			//cout<<col<<loc<<endl;
			int ci = col=='O'?0:1;
			d[ci].PB(i);
			d[ci].PB(loc);
		}
		//cout<<d<<endl;
		int pi = 0;
		int ci[2];
		int cur[2];
		ci[0]=ci[1]=0;
		cur[0]=cur[1]=1;
		REP(step, 100*100)
		{
			int pushed = 0;
			int end = 1;
			REP(col, 2)
			{
				if(ci[col]>=d[col].size()/2) continue;
				end = 0;
				
				int p = d[col][ci[col]*2+0];
				int loc = d[col][ci[col]*2+1];
				if(cur[col]==loc)
				{
					if(pi==p)
					{
						//cout<<col<<" push "<<cur[col]<<endl;
						pushed=1;
						ci[col]++;
					}
					else
					{
						//cout<<col<<" stay"<<endl;
					}
				}
				else
				{
					int dir = loc - cur[col] > 0 ? 1 : -1;
					cur[col]+=dir;
					//cout<<col<<" move to "<<cur[col]<<endl;
				}
			}
			if(pushed) pi++;
			if(end) break;
			ans++;
		}
		cout<<"Case #"<<t+1<<": "<<ans<<endl;;
	}
	return 0;
}
 |