2012年1月24日火曜日

TopCoder SRM319 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。

歪対称行列というのはt(M)=-Mを満たすMのことである(tは転置の意)。歪対称行列の性質として、対角成分が0になるということが挙げられる。minChangesというメソッドを含むSkewSymmetricというクラスを作成しよう。メソッドminChangesはMという文字列型の配列を引数に取る。Mの各要素は整数が半角の空白1つで区切られたリストである。Mのi番目の要素のj番目の数字が行列の(i,j)成分を表す。行列Mを歪対称行列に変換するのに最低何回変換を行うかを返すようにメソッドを作成せよ。

私の解答はこちら。

public class SkewSymmetric {

 public int minChanges(String[] M) {
  int nRow = M.length;
  int nCol = M.length;
  int[][] im = new int[nRow][nCol];
  // 行列に整数成分を設定
  for( int i=0 ; i<nRow ; i++ ){
   String[] work = M[i].split(" ");
   for( int j=0 ; j<nCol ; j++ ){
    im[i][j] = Integer.parseInt(work[j]);
   }
  }
  int nChange = 0;
  // 歪行列に変換する必要の有無を判定(上三角成分のみ確認)
  for( int i=0 ; i<nRow ; i++ ){
   for( int j=i ; j<nCol ; j++ ){
    if( i == j ){
     if( im[i][j] != 0) nChange++;
     continue;
    }
    if( im[i][j] != -im[j][i] ) nChange++;
   }
  }
  return nChange;
 }

}

得点は238.22/250、中央値は約169点。入力を数値に変換する手法として、Scannerを利用する手もあるようだ。また、対角成分か否かで成分の変換の必要性を判定しているが、対角成分であるときの処理は不要である。対角成分の判定もim[i][j] != -im[j][i]で調べればよいということである。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計