第2回 ドワンゴからの挑戦状 予選(問題A,B)

タイトル通り2完でした。C問題の「最悪の時の最短時間」っていうのがゲームっぽいからアルファ・ベータ法か何かかな…とは思ったけど、ゲーム系はNimぐらいしか実装したこと無いのでさっぱりな人でした。

取り敢えずコンテスト終了と同時にBまでは解説を出そうと。

A - ニコニコ数

問題概要

1からNまでの整数で約数にニコニコ数を持つものがいくつあるか求めよ。
(ニコニコ数とは、25,2525,252525など2から始まり、2と5が交互になっている偶数桁の数字である)

http://dwango2016-prelims.contest.atcoder.jp/tasks/dwango2016qual_a

解法

そもそも2525は25で割り切れる。他ニコニコ数は全て25で割り切れます。

今回は「約数にニコニコ数を持つ数字の数」を求めるのだから、25で割り切れればOK。

ここで、1〜Nまでの数字で25を約数に持つ数字の数はN/25で求められるので、これを出力するだけ。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll n;   cin>>n;
    cout<<n/25<<endl;
    return 0;
}

B - 積み鉛筆

問題概要

平面ピラミッドの2段目をmax(左下の数字、右下の数字)で定義して作った。2段目が与えられるので1段目として考えられるものを1つ答えよ。

http://dwango2016-prelims.contest.atcoder.jp/tasks/dwango2016qual_b

解法

o o o o o

o o o o o o

とあった時、下の要素が影響を与えるのはその要素の右上と左上(これ最重要)。

ここで1段目を左から確定していく時、1番左は2段目の1番左と同じでも問題は無いはず。

左から2番目はあり得る候補として2段目の1番左と2番目。左から1番目と比較して、大きい方が2段目の1番左と一致している方を選ぶ。両方OKならより小さい方を採用。

以下同様に左から決めていき、右端は2段目の右端と一致させれば通ります。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n; cin>>n;
    vector<int> a(n-1);
    for(int i=0;i<n-1;i++)  cin>>a[i];
    vector<int> ans; ans.push_back(a[0]);
    for(int i=1;i<n-1;i++){
        int s=a[i-1],t=a[i];
        if(s>t)    swap(s,t);
        if(max(ans[i-1],s)==a[i-1]) ans.push_back(s);
        else if(max(ans[i-1],t)==a[i-1])  ans.push_back(t);
        else ans.push_back(1);
    }
    ans.push_back(a[n-2]);
    for(int i=0;i<n;i++){
        cout<<(i?" ":"")<<ans[i];
    }
    cout<<endl;
    return 0;
}

感想

C問題がサッパリ分からない…全完者は3名でした。

解説が出たら残りも解きたいです(しかし前回のSRMのMedが解き終わっていない)