SRM 463 DIV2

904 -> 942

  ( ^ω^) ……
   V ノ> 
   ││ 
   ┛┗  
問題 結果 備考
250 Passed System Test 101.41pt
500 Passed System Test 408.56pt
1000 Opened

撃墜はなし。部屋の1000が次々ブチ落とされていくのを呆然と眺めてました。



250 - BunnyPuzzle

問題文

import java.util.*; 
public class BunnyPuzzle { 
  public int theCount(int[] bu) { 
    int res = 0; 
    Arrays.sort(bu); 
    if(bu.length==2) return 2; 
    for(int i=0; i<bu.length-1; i++){ 
      int j=i+1; 
      int dis = Math.abs(bu[j]-bu[i])*2; 
      if(j==bu.length-1){ 
        res++; 
      } else if(chk(bu, bu[i]+dis, bu[j+1], true)){ res++;}
      if(i==0){ 
        res++; 
      }else if(chk(bu, bu[j]-dis, bu[i-1], false)){ res++;}
    }
    return res; 
  } 
  boolean chk(int[] arr, int bb, int e, boolean r){ 
    for(int i=0; i<arr.length ;i++){ 
      if(arr[i] == bb) 
        return false; 
    } 
    if(r) 
      if(bb<e) return true; else return false; 
    else 
      if(bb>e) return true; else return false; 
  } 
}

56分かかるとか遅すぎて洒落にならない。
もう途中から完全に混乱して半泣きだったので、一旦消して落ち着いて一から書き直したら通った。

500 - RabbitNumbering

問題文

残り17分。絶望しながら500を開いたけどあっさり解けてびびる。

import java.util.*; 
public class RabbitNumbering { 
  public int theCount(int[] maxN) { 
    long res = 1; 
    Arrays.sort(maxN); 
    int len = maxN.length-1; 
    for(int i = 0, j = 0; i<=len; i++, j++){ 
      res *= maxN[i]-j;; 
      res = Math.abs(res % 1000000007); 
    } 
    return (int)res; 
  } 
}


小さいのから1つずつ数えていけば終了。
ダブルなセミコロンや、なぜか絶対値を取ってるところから、とても焦ってたことがうかがえる。

1000 - Nisoku

問題文


解けそうな気がしたのでpracticeで挑戦したけどギブアップ。


以下はテストケースは通ったもののSystem Testであっさり落ちるコード。

import java.util.*;
public class Nisoku {
  public double theMax(double[] cards) {
    Arrays.sort(cards);
    ArrayList<Double> prev = new ArrayList<Double>();
    ArrayList<Double> now = new ArrayList<Double>();
    for(double c : cards) prev.add(c);
    while(true){
      while(prev.size()>0){
        int size = prev.size();
        if(size==1) {
          now.add(prev.remove(0));
          break;
        }
        double a = prev.remove(size-1);
        double b = prev.remove(0);
        double c = a+b;
        double d = a*b;
        now.add( c>d ? a+b : a*b );
      }
      if(now.size()==1) return now.remove(0);
      prev.addAll(now);
      Collections.sort(prev);
      now.clear();
    }
  }
}

ソート済みのリストから頭と尻から数をとってきて、+,*両方やってみて大きい方を採用、を繰り返し、要素の数が1つになったらそれを返して終了。
なぜこれでテストケース通ったんだ...


practice roomでwriterさんのコードを読んだら解き方は理解できたのでよしとする。

メモ

  • どうせ春休みで暇なんだから過去問解こうぜ!
  • どこが分からないかすら分からなくなったら一から書き直すのも手