この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 件のコメント:
コメントを投稿