このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
多くのコンピュータシステムでは、同じクロックサイクルの間、複数のプロセスが同じ資源から読み込みができるが、1サイクルに1つのプロセスしか書き込みができない。読み込みと書き込みは同じクロックに混ぜることはできない。読み込みと書き込みの履歴がtraceという文字列として与えられ、procという計算に利用されたプロセッサの数が与えられたとき、その処理にかかった最小クロック数を返すメソッドを返せ。traceのRという文字が読み込みを、Wという文字は書き込みを表すものとする。
たとえば、"RWWRRR"というtraceと、3というprocが与えらえると、その処理に必要となる最小クロック数は4である。先頭のRで1クロック、W2つで2クロック、R3つは1クロックで処理できるから1+2+1=4ということになる。
私の解答はこちら。
public class MultiRead { public int minCycles(String trace, int procs) { int nr = 0; // rが連続している回数(procと関連して必要な変数) int nCycle = 0; // サイクル数をカウント boolean isPrevW = true; // 直前の文字はWか? for( int i=0 ; i<trace.length() ; i++ ){ if( trace.charAt(i) == 'W' ){ nCycle++; // Wはとにかく1クロックと数える。 nr = 0; // rが連続した回数は0にリセット isPrevW = true; }else{ // R if( isPrevW == true ){ isPrevW = false; nr = 1; nCycle++; }else{ nr++; } // もしRが大量に続いたら、次のクロックに移る if( nr > procs ){ nr = 1; nCycle++; } } } return nCycle; } }
得点は219.53/250、中央値は約200点。1発で通した。Rがprocsを越えて続いた場合の処理を誤らないことがポイント。
0 件のコメント:
コメントを投稿