日記書くといいつつぼーっとしてた。SRM600。

今日は連日の仕事も終わり・・・ということで、
日記も昨日の分しか書かずにぼーっとしてました。

夜は家族で久々に焼肉。一応忘年会のつもりらしい。

f0019846_18111586.jpg


f0019846_1810769.jpg


f0019846_18103175.jpg


f0019846_18104143.jpg


f0019846_18104784.jpg


f0019846_18105415.jpg


f0019846_181113.jpg


f0019846_18112714.jpg


f0019846_18113978.jpg


f0019846_18114929.jpg


f0019846_18115984.jpg


f0019846_1812786.jpg


f0019846_18121316.jpg


という感じの内容でした!(写真はメニュー順

食べ放題じゃなくても十分に量あります…。
その後はゲーセンでdivaメイン。

Reflec beatのダイヤ解禁情報ですが、
リフレクの曲解禁しますよー じゃダメで、
今からリフレクの曲解禁しますよー! か
今からリフレクの曲解禁しますよー!!!!で通りました。

f0019846_18134260.jpg


終焔のClaudia84.9
f0019846_18135626.jpg


サバゲリミあと2回・・・。
f0019846_18143921.jpg


プレー開始時綺麗に1万VPでした。
f0019846_1815724.jpg


Stay with me。正直これが一番難しかった。
f0019846_18153024.jpg


天樂
f0019846_18155351.jpg


DYE
f0019846_18161344.jpg


そして今日は記念すべきTopCoder600回目があるので、23時には離脱する。
500回目は人数超過で参加できなかったので、ぜひとも参加したいということで。

その後は胃もたれしつつ、まともに仮眠できず、2時にスタート。

easyは、人数の配列が与えられていて、x人乗りの船を用意する。
船のコストは base+x*人数コスト であり、船の大きさは変えられない。
配列の要素ごとにまとめて載せる必要があるとき、最小コストはいくつになるか。

計算で求めるのは難しいと判断して、必要なところまで全探索。これでよい。


import java.util.Arrays;

public class TheShuttles {

public int getLeastCost(int[] cnt, int baseCost, int seatCost) {
Arrays.sort(cnt);
int max = cnt[cnt.length-1];
int min_cost = Integer.MAX_VALUE;
for(int i = 1 ; i <= max ; i++){
int tmp_cost = 0;
for(int j = 0 ; j < cnt.length ; j++){
int num = cnt[j] / i;
if(cnt[j] % i != 0)num++;
tmp_cost += (baseCost + seatCost * i) * num;
}
min_cost = Math.min(tmp_cost, min_cost);
}
return min_cost;
}

}


mediumは、数列が与えられていて、orを取ってゴールの値に向かうが、
ゴールさせないために除く必要のある数値の最小数を求めよという問題。

まずはゴールより大きな値は排除しておく。(絶対にゴールできないので)
その後で、ビットごとに見て、ゴール対象になる数値を、桁ごとにカウントし、
一番小さい値を返せば良い。

たとえば、goalが11のとき、6は2が含まれているが、同時に11に持ってない要素4を含んでいるので、
カウントしないようにする。

1011 = 11
0110 = 6

import java.util.Arrays;

public class ORSolitaireDiv2 {

public int getMinimum(int[] numbers, int goal) {
int count = 0;
for(int i = 0 ; i < numbers.length ; i++){
if(numbers[i] <= goal)count++;
}
Arrays.sort(numbers);
int[] numbers2 = new int[count];
int index = 0;
for(int i = 0 ; i < numbers.length ; i++){
if(numbers[i] <= goal){
numbers2[index] = numbers[i];
System.out.print(numbers2[index]+" ");
index++;
}
}
System.out.println("bnopee");

int ketas = 0;
int g = goal;
while(g != 0){
g /= 2;
ketas++;
}

int[] ketanum = new int[ketas];
boolean[] keta_flat = new boolean[ketas];
for(int i = 0 ; i < ketanum.length ; i++){
int b_x = (int)Math.pow(2, i);
if((goal & b_x) != b_x)keta_flat[i] = true;
}

for(int i = 0 ; i < ketanum.length ; i++){
if(keta_flat[i])continue;
int b_x = (int)Math.pow(2, i);
for(int j = 0 ; j < numbers2.length ; j++){
int bit_num = numbers[j] & b_x;
System.out.print(bit_num+","+b_x+" ");
if(bit_num == b_x){
boolean furui = true;
for(int k = 0 ; k < keta_flat.length ; k++){
if(keta_flat[k]){
int c_x = (int)Math.pow(2, k);
int bit_num2 = numbers[j] & c_x;
if(bit_num2 == c_x){
furui = false;
break;
}
}
}
if(furui)ketanum[i]++;
}
}
}
System.out.println();
for(int i = 0 ; i < ketanum.length ; i++){
System.out.print(ketanum[i]+","+keta_flat[i]+" ");
}
System.out.println();
int min = Integer.MAX_VALUE;
for(int i = 0 ; i < ketanum.length ; i++){
if(!keta_flat[i]){
min = Math.min(ketanum[i], min);
}
}
return min;
}

}



そんなこんなで、レートがdiv1に戻りました。
1154->1211

後は嬉しい事に、アレが当たりました…。ひえぇ…。

  by ddrer-yossi | 2013-12-14 23:44 | TopCoder

<< 進捗を進めつつもぐったり 仕事奴ー >>

SEM SKIN - DESIGN by SEM EXE