JOI-レベル6を解いた

JOI-レベル6を解いた

とりあえずレベル6の予選本選問題を解いたのでメモ

おせんべい

横の数が最大10行なので、行を回転させる組み合わせは1024通りのみ

これは全探索でいける

あとは列の回転方法だが,

白が多い->回転させない
黒が多い->回転させる

というふうにすればよい

これでAC

僕のコード

ダーツ

DPは点数の合計が大きすぎるので無理と判断

投げないという判断は、点数が0ということと同義なので

4本絶対投げるが的に0点という枠がある、と考えて良い

これで考えやすくなったので、あとは2本投げた結果を2つ組み合わせればいい

組み合わせる方法

1.最初の2本の点数をvとする
2.M-v以下の数を探す(2分木で探す)
3.足す

これの最大値を取ればいい

僕のコード

連鎖

ぷよぷよやん

1.一個変える部分を決める(index..iとする)
2.その隣の色にする(i-1,i+1の色)
3.int rec(i-1,i)と進めていく

再帰は中身見たらわかるはず

僕のコード

ピザ

店の場所は,D={0,d2,d3,...,dn,d}としたほうが考えやすい

1.届け先をkとする
2.Dの中でk以上で一番小さい数をrとする
3.Dの中でk以下で一番大きい数をlとする
4.min(k - l, r - k)が一番近い店からの距離である

これの総和を求めればいい

僕のコード

通勤経路

下からくる場合、左からくる場合と条件を分ければいいですね

僕のコード

つらら

車の中でやったやつですね...

折れるつららをqueueに突っ込んでいき、順番に計算させていきます

つららを折ったら隣が折れるかどうかチェックしていく

つららが折れ始める時間は隣の折れた時間なので,それも記録していきます

僕のコード

古本屋

本はジャンル分けして、値段の高い順にソートしておきます

ソートしたものを1冊,2冊,,,とセットにした値段をboxに入れておきます

後は

FOR(k,1,boxs[i].size() - 1)
{
    if(j - k >= 0)
    {
        dp[i][j] = max(dp[i][j],dp[i - 1][j - k] + b[i][k] + k * (k - 1));
    }
}

というふうにdpしてやればおk

僕のコード

イルミネーション

この問題の図の外側を1マス広げると考えやすい

1.建物の外にあるマスをマーキングしていく
2.建物のマスをたどっていく
3.建物のマスの外側のマスが1でマーキングしたマスであれば,resultを1加算する(建物の外から見える壁であるため)

幅優先で解けますね

僕のコード

夜店

SをまたがないようにDPする

僕のコード

電飾

交互になっている部分はまとめて変えたほうがいい

色が交互になっている場所を探し。右側の色と左側の色と長さを覚えておく

考えるのは、右側の色と左側の色が違うかどうかで長さが変わる

うまく説明できないなぁ

僕のコード

部活のスケジュール表

ビットdp

dp[i][j]:=i日目がjという組み合わせで参加した時の組み合わせ数

責任者がいるか、カギを持つ人がいるかをチェックしていく

僕のコード

JOI紋章

まず初期での紋章の数を数える

正方形を変えた時に影響を受けるのは一部なので,そこだけ計算させればいよい

僕のコード

IOI饅頭

dp[i][j]:=箱をi種類まで選び饅頭をj個入れる場合に必要な箱の値段

あとは饅頭を大きい順に入れてみるだけ

僕のコード

ケーキの切り分け2

区間DPを勉強しました

僕のコード

オレンジの出荷

よく覚えていない...

もう一回解こうかな

僕のコード

スタンプラリー2

Jは先頭に、Iは後端に置くべき

組み合わせの計算方法が大切ですね

僕のコード

最後の方グダってますね...