2010年12月13日月曜日

TopCoder SRM489 DIV2

初めてのTopCoder本番ってわけだったんですが、結果は何とも言えないものにw
250 チャレンジ
500 未提出
1000 未提出

1問も解けなく、点数はもちろん0なわけですが、レートは955というそれなりに高いという結果に。いきなり緑。
どうやら250の正解率が低かったみたい。


修正済み250
public class BadVocabulary {
 public int count(String badPrefix, String badSuffix, String badSubstring, String[] vocabulary) {
  int bad = 0;
  for(String word : vocabulary) {
   //pre
   if(word.length() >= badPrefix.length()) {
    if(word.substring(0, badPrefix.length()).equals(badPrefix)) {
     bad++;
     continue;
    }
   }
   //suf
   if(word.length() >= badSuffix.length()) {
    if(word.substring(word.length() - badSuffix.length()).equals(badSuffix)) {
     bad++;
     continue;
    }
   }
   //sub
   if(word.length() >= badSubstring.length() + 2) {
    boolean flag = false;
    for(int i = 1; i < word.length() - badSubstring.length(); i++) {
     if(word.substring(i, i + badSubstring.length()).equals(badSubstring)) {
      bad++;
      flag = true;
      break;
     }
    }
    if(flag) {
     continue;
    }
   }
  }
  return bad;
 }
}
250を落とした理由はcontinueを書かなかったので、多めの結果を返していたからでした。
はっきり言って問題の読み間違いですね。ほかの人が間違えてるとこと別のとこで間違えてた。アホス

500
public class BuyingFlowers {
 public int buy(int[] roses, int[] lilies) {
  int min = Integer.MAX_VALUE;
  for(int mask = 1; mask < (1 << roses.length); mask++) {
   int rose = 0;
   int lily = 0;
   for(int i = 0; i < roses.length; i++) {
    if((mask & (1 << i)) > 0) {
     rose += roses[i];
     lily += lilies[i];
    }
   }
   
   if(Math.abs(rose - lily) > 1) continue;
   int area = rose + lily;
   for(int l = 1; l * l <= area; l++) {
    if(area % l == 0) {
     min = Math.min(min, Math.abs(l - area / l));
    }
   }
  }
  if(min == Integer.MAX_VALUE) return -1;
  else return min;
 }
}
問題は理解したけどどうやって解いていいかわからず。
全パターン調べるのってこうやってやるんですね。これは正直知らないとできない・・・

こういうテクニックってどこで教えてもらえるんですか・・・プログラミングコンテストチャレンジブック買えばいいんですか?

0 件のコメント:

コメントを投稿