2014年1月7日火曜日

SRM 603 Div2 Easy/Medium

SRM 602 Div3 Easy MiddleCode 

 回答

substringの仕様に気をつけて頑張るだけ
 substring(a,b) は aからb-1 までの文字


public String encode(String s)
 {
  String t = "";
  while (s.length() > 1) {
   int mid = s.length() / 2;
   if (s.length() % 2 == 1) {
    t += s.charAt(mid);
    s = s.substring(0, mid) + s.substring(mid + 1);
   } else {
    if (s.charAt(mid - 1) < s.charAt(mid)) {
     t += s.charAt(mid - 1);
     s = s.substring(0, mid - 1) + s.substring(mid);
    } else {
     t += s.charAt(mid);
     s = s.substring(0, mid) + s.substring(mid + 1);
    }
   }
  }
  return t + s;
 }

SRM 603 Div2 Medium SplitIntoPairs 

回答
なんとAを昇順にソートして、そのとなりの要素とかけてXより大きかをチェックするだけという。
あとは、オーバーフローに気をつけてlong にキャストするのは忘れずに
理由
負*負,正*正 はもちろん正になるため、普通にカウントできる
問題は
負*正 この組み合わせの時でこれがXより大きいかが問題。
ソートすると隣り合った負*正 が一番大きくなります。(絶対値が小さくなります)
これを判定するだけです。
そして、うまく組み合わせると こんなシンプルになります。
public int makepairs(int[] A, int X)
 {
  Arrays.sort(A);
  int count = 0;
  for (int i = 0; i < A.length ; i += 2) {
   if ((long) X <= ((long) A[i]) * A[i + 1]) {
    count++;
   }
  }
  return count;
 }

0 件のコメント:

コメントを投稿