慎重に解いた。ノーペナで解けたのは収穫。
問題概要
のグリッドに、以下の条件を満たすように 個のルークと 個のポーンを配置することが可能かどうかを判定せよ (ルークとポーンを合わせて駒と呼ぶ)。
- どのルークについても、それと同じ行・同じ列には駒ない
- どのポーンについても、その上に隣接するマスには駒がない
(マルチテストケース問題)
制約
考えたこと
まずルークは 個までしか置けない。そして、ルークを置く列は左から 列だとしても問題なく、ポーンは右側の 列に配置することにする。まず、明らかに である。
少し具体的なケースについて手を動かして考えてみよう。たとえば のときには、下図の赤マスの位置にルークを置くことで、ポーンは黄色マスには全て置くことができる。そして明らかにこれ以上のマスには置けない。
一方、 のときには、ルークを 個置くことはできない。ルーク自身が上下に隣接することはできないためだ。下図のような場合が最大となる。そしてよく考えると、下図のようなポーンの配置行数は、たとえ であったとしても最大行数である。
これらの場合から、ポーンの置ける個数を考えると、次の条件が浮かび上がる。
- でなければならない (ルークと同じ行はダメであることから)
- でなければならない (ポーン同士が上限に隣接してはならないことから)
そして、
- である場合には後者がネックになる
- である場合には前者がネックになる
ということが分かる。また、これらネックとなる最大ケースは実際に構築できることも容易にわかる。
まとめ
- のとき、 が条件
- のとき、 が条件
コード
#include <bits/stdc++.h> using namespace std; bool solve() { long long N, A, B; cin >> N >> A >> B; if (A > N) return false; else if (A <= (N / 2)) return (B <= (N + 1) / 2 * (N - A)); else return (B <= (N - A) * (N - A)); } int main() { int T; cin >> T; while (T--) { cout << (solve() ? "Yes" : "No") << endl; } }