2012年1月8日日曜日

TopCoder SRM305 Div2 250Pts

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

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計