コンテストページ: https://yukicoder.me/contests/471
D, K を作問しました。
正整数 が与えられます。 個の正整数からなる数列 であって、 次の条件:
をすべて満たすものが存在するか判定してください。存在するなら辞書順最小のものを1つ出力してください。 個のテストケースが与えられるので、それぞれについて答えを求めてください。
灰diffの問題を作るのにあたり、
ということを目的として考えた結果、この問題が生まれました。 「先頭 個は で、最後は余ったもの」とすればよいです。灰diffでちょうどよいかなと思っています。
マルチテストケースの問題は、
int main() { int t; cin >> t; while (t--) { // solve }}
として解くより、
void solve() { // solve}
int main() { int t; cin >> t; while (t--) { solve(); }}
として解く方が // solve
のインデントが浅くなり良い書き方だと思います。
正整数 が与えられます。 個の正整数からなる数列 であって、 次の条件:
をすべて満たすものが存在するか判定してください。存在するなら辞書順最小のものを1つ出力してください。 個のテストケースが与えられるので、それぞれについて答えを求めてください。
D問題の不等号逆verです。 こういう制約が少し変わったものが後ろに置かれるのが個人的に好きなのですが、今回のセットで実現できてよかったです。
Dが先に作問されてから、Kの制約で解ける?みたいな話になり、無事解けて難易度も良い感じだったので Kに置かれました。
個人的には割とこういう問題は苦手意識があるのですが、この問題は小さいケースの愚直を書くと答えの構成が分かりそうだなと思います。
#include<bits/stdc++.h>using namespace std;
vector<int> solve5(int x) { for (int a1 = 1; a1 < x; a1++) { for (int a2 = 1; a2 < a1; a2++) { for (int a3 = 1; a3 < a2; a3++) { for (int a4 = 1; a4 < a3; a4++) { for (int a5 = 1; a5 < a4; a5++) { if (a1 + a2 + a3 + a4 + a5 == x) { return {a1, a2, a3, a4, a5}; } } } } } } return {-1};}
int main() {
for (int x = 13; x <= 25; x++) { auto ans = solve5(x); cout << x << "\t: "; for (auto a: ans) cout << a << " "; cout << endl; }
}
13 : -114 : -115 : 5 4 3 2 116 : 6 4 3 2 117 : 6 5 3 2 118 : 6 5 4 2 119 : 6 5 4 3 120 : 6 5 4 3 221 : 7 5 4 3 222 : 7 6 4 3 223 : 7 6 5 3 224 : 7 6 5 4 225 : 7 6 5 4 3
この増え方からなんとなく推測するとよいなぁというのが想定です。 実際これで良いことが証明できます、頑張って証明しました。
にぶたんでも解けるらしいです(解いていません)。
いろいろなタスクを他の運営の方に投げてしまい、 解説を書くのも他の問題に対して一番遅くなってしまったりで申し訳ありませんでした。もし第三回が開催されるなら(!?) もっといろいろタスクをこなしたいです。
Clarが飛んでこなかったのは良かったのですが、想定より多くの人が通していてびっくりです (Dを解いた後Kを見に行った人が一定数いたっぽい?)。 難易度推定は難しいですね。
オンサイトの運営にかかわるのは初めてでしたが、無事多くの人に楽しんでもらえたようで良かったです。 運営の皆さん、緑以下コンに参加してくれた方々ありがとうございました!