CODE FESTIVAL 2016 Final

A問題

A: Where's Snuke? - CODE FESTIVAL 2016 Final | AtCoder

  • snukeという文字列がある場所の列(アルファベット)と行(数字)を出力

コード

#include <bits/stdc++.h>
 
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
#define FOR(i,k,n) for(int i=(k);i<(int)(n);++i)
typedef long long int ll;
using namespace std;
 
string s;
int H, W;
 
int main(void) {
    cin >> H >> W;
    REP(i, H) {
        REP(j, W) {
            cin >> s;
            if(s=="snuke") {
                char c = 'A'+j;
                cout << c << i+1 << endl;
            }
        }
    }
}

Submission #991415 - CODE FESTIVAL 2016 Final | AtCoder

B問題

B: Exactly N points - CODE FESTIVAL 2016 Final | AtCoder

  • 和がNになる重複のない自然数の集合で最大の数字が最も小さい集合を出力せよ

方針

  • m(m+1)/2 > Nとなる最小のmを取り、大きいものから順に除外できる数字を除外していって、ちょうどNになる集合を作る

コード

#include <bits/stdc++.h>
 
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
#define FOR(i,k,n) for(int i=(k);i<(int)(n);++i)
typedef long long int ll;
using namespace std;
 
int main(void) {
    int N;
    cin >> N;
    int m = 1;
    for(int i=1; i<=N; ++i) {
        if(i*(i+1)/2 >= N) {
            m = i;
            break;
        }
    }
    int res = m*(m+1)/2 - N;
    vector<int> contain(m+1);
    contain.assign(contain.size(), 1);
    for(int i=m; i>0; --i) {
        if(res == 0) break;
        if(res-i >= 0) {
            res -= i;
            contain[i] = 0;
        }
    }
    for(int i=1; i<=m; ++i) {
        if(contain[i]) cout << i << endl;
    }
}

Submission #992560 - CODE FESTIVAL 2016 Final | AtCoder

C問題

C: Interpretation - CODE FESTIVAL 2016 Final | AtCoder

  • N人が話すM種類の言語が与えられる。全員が意思疎通可能か答えろ

方針

  • N+M個の頂点を持つ二部グラフを作って人を表すN個の頂点が連結かどうか調べる
  • 連結判定はDFSでできる

コード

#include <bits/stdc++.h>
 
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
#define FOR(i,k,n) for(int i=(k);i<(int)(n);++i)
typedef long long int ll;
using namespace std;
vector<vector<int> > edge;
vector<bool> visit;
 
void dfs(int v) {
    if(visit[v]) return;
    visit[v] = true;
    for(int i=0; i<edge[v].size(); ++i) {
        dfs(edge[v][i]);
    }
}
 
int main(void) {
    int N, M;
    int K, L;
    cin >> N >> M;
    edge.resize(N+M);
    REP(i, N) {
        cin >> K;
        edge[i].resize(K);
        REP(j, K) {
            cin >> L;
            L = N+L-1;
            edge[i][j] = L;
            edge[L].push_back(i);
        }
    }
    visit.resize(N+M);
    dfs(0);
    REP(i, N) {
        if(!visit[i]) {
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;
}

Submission #993138 - CODE FESTIVAL 2016 Final | AtCoder

D問題

通らず

E問題

部分点を狙ってt秒でできる最大クッキー数を考えたが失敗