接着剤の精進日記

競プロでの精進や研究に関係したことを書いていきます。

パナソニックプログラミングコンテスト2020

atcoder.jp

灰 パ フ ォ
やらかしましたね

A - Kth Term

配列をコピペして出力する
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int K;
    cin >> K;
    int v[32] ={1, 1, 1, 2, 1, 2, 1, 5, 2, 2, 1, 5, 1, 2, 1, 14, 1, 5, 1, 5, 2, 2, 1, 15, 2, 2, 5, 4, 1, 4, 1, 51};
    cout << v[K-1] << endl;
}

B - Bishop

基本的には、HとWのどちらかが偶数なら\frac{H \times W}{2}
どちらも奇数なら\frac{H \times W}{2} + 1
でいいけど、 H == 1 || W == 1の時、初期地点から動けないので注意
全然気づけなかったので反省…
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    ll H, W;
    cin >> H >> W;
    if(H == 1 || W == 1) cout << 1 << endl;
    else if(H % 2 == 0 || W % 2 == 0) cout << (H * W) / 2;
    else cout << (H * W) / 2 + 1 << endl;
}

C - Sqrt Inequality

見るからに計算誤差がやばそうなので頑張ってくれと言っている
とりあえず両辺を二乗してみると
 a + b + 2 \sqrt{ab} \lt cを満たせばいい
√一個なら許されない?と思って出すも許されなかった(これで通る場合もあるっぽい)
あとは相加相乗平均とか変な方向に迷走してしまい終了
実はこれをもう一回二乗してあげると√が外れていい感じになる(それはそう…)
 4ab \lt (c - a -b)^2 となるのでこれを満たすかどうかを確認すればいい
ただし、(c - a - b)が負なら成り立たないので注意
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    ll a, b, c;
    cin >> a >> b >> c;
    if(c - a - b >= 0 && 4 * a * b < (c - b - a) * (c - b - a)) cout << "Yes" << endl;
    else cout << "No" << endl;
}

D - String Equivalence

解説コードを見るまで問題文の意味が理解できませんでした(読解力さん…)
標準形を作る際には、今まで使った文字の中の最大+1までしか使えないので
dfsとかでその情報を渡しながら文字を作っていくといい
問題文をちゃんと理解さえすればそこまで難しくないので通したかったね
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    auto dfs = [&](auto && self, string s, char mc) ->void{
        if(s.size() == n) cout << s << endl;
        else{
            for(char c='a';c<=mc;c++){
                if(c == mc) self(self, s + c, char(mc+1));
                else self(self, s + c, mc);
            }
        }
    };
    string S = "";
    dfs(dfs, S, 'a');
}

おわりに

コーナーケースにハマり、式変形でもハマって見事にやられてしまった
C解けなくてD見たけど焦ってたのもあって問題が理解できず結局Cと一緒に沈んでしまった
いい勉強になりました…
その後のこどふぉでたら+71でプラマイゼロになったのでよし(ほんまか?)