SRM452 DIV2

250 - EggCartons

6個, 8個と入っている、2種類の卵の箱がある。
n個の卵を買いたいとき、最も少ない箱の数で買えよ!って問題。
ぴったりn個買えないときは-1。


スマートな解き方が分からない。
最大で100*100だし全部確かめればいいよね!

import java.util.*;
public class EggCartons {
    public int minCartons(int n) {
	 int res = 0;
	 if(n<6) return -1;
	 for(int i=0; i<n;i++){
	     for(int j=0; j<n;j++){
	 	if(6*i+8*j==n) return i+j;
	     }
	 }
        return -1;
    }
}

submitしてから気付いたけれど、nまで見る必要なかった。i<=n/6, j<=n/8でおk。
でももっかいsubmitすると点数下がったような気がしたのでほっときました。
208.1pt獲得。

500 - NotTwo

width x heightマスの盤がある。
全ての石について、2つの石間のユークリッド距離が2にならないように盤に置ける石の最大数を求める問題。


……ユークリッド距離をググるところからはじまりました。
ユークリッド距離がちょうど2になるのは縦横±2の場所だけなので、
左上から石を置きつつ、縦横±2の場所に置けませんよチェックを入れていけばおk?
ということでこんなかんじ。

import java.util.*;
public class NotTwo {
    public int maxStones(int width, int height) {
        int[][] ar = new int[height][width];
	int res = 0;
	for(int i=0; i<height; i++){
	    for(int j=0; j<width; j++){
		if(ar[i][j]!=-1) {
		    ar = setStones(j, i, ar);
		    res++;
		}
	    }
	}
        return res;
    }
    public int[][] setStones(int x, int y, int[][] aar){
	aar[y][x] = 1;
	if(x+2<aar[y].length) aar[y][x+2] = -1;
	if(x-2>-1) aar[y][x-2] = -1;
	if(y+2<aar.length) aar[y+2][x] = -1;
	if(y-2>-1) aar[y-2][x] = -1;
	return aar;
    }
}

気をつけながら書いたけどやっぱり何度かxとyを間違える。
最大で1000*1000ってあぶないかな?と思ったけど、ええいどうせスマートなコードなんて書けねー!とsubmit。
2つの試練を無事潜り抜けて321.94ptげっと。

1000 - HamiltonPath

最初、"Y"の都市間にだけ道路があると勘違いしていて、
exampleを見て「なんで道ないのに1から2に行ってんの!?」と混乱してました。ひどい。


問題文を正しく理解した頃には残り16分。
ひとつの行に2つ以上Yがあったら0->1, 0->2は同時に満たせないので通れないんじゃないか?と思ったけど
道路は双方向なことを忘れていた。この場合普通に1->0->2でいける。
でも3つ以上の時は通れないね!と分かったところで時間切れ。


どう解けばいいのか分からないのでエロい人のコードを見つつあとで復習する。きっと。

結果

530.04pt獲得してrateは951から1033に。やった4桁だ!
次は再来週にあるようなので、それまでにいくつか過去問といておきたい。