CODE FESTIVAL 2016 qual C

A問題

A: CF - CODE FESTIVAL 2016 qual C | AtCoder

文字列がCFを部分文字列として含むか判定せよ

方針

  • Cを見つけたらレベルへ、レベル1でFを見つけたらクリアみたいな

    コード

#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) {
    string s;
    int k=0;
    cin >> s;
    for(int i=0; i<s.size(); ++i) {
        if(k==0 && s[i]=='C') k=1;
        if(k==1 && s[i]=='F') {k=2; break;}
    }
    if(k==2) cout << "Yes" << endl;
    else cout << "No" << endl;
}

Submission #942379 - CODE FESTIVAL 2016 qual C | AtCoder

B問題

B: K個のケーキ / K Cakes - CODE FESTIVAL 2016 qual C | AtCoder

なるべく連続したケーキを食べないようにするとき、連続したケーキを食べる回数

方針

可能なら前回食べたケーキを食べないようにして、残りが一番多いケーキを食べる

コード

#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 K, T;
    int a[101];
    cin >> K >> T;
    REP(i, T) {
        cin >> a[i];
    }
    int ans = 0;
    int max = 0, max_index=-1;
    REP(j, T) if(a[j] > max) {max = a[j]; max_index = j;}
    int before = max_index;
    a[max_index]--;
    REP(i, K-1) {
        max = 0, max_index=-1;
        REP(j, T) if(a[j] > max && j!=before) {max = a[j]; max_index = j;}
        if(max_index != -1) {
            before = max_index;
            a[max_index]--;
        }
        else {
            a[before]--; ans++;
        }
    }
    cout << ans << endl;
}

Submission #943260 - CODE FESTIVAL 2016 qual C | AtCoder

C問題

C: 二人のアルピニスト / Two Alpinists - CODE FESTIVAL 2016 qual C | AtCoder

  • 右から見てそこまでで一番高い山と左から見たそこまでで一番高い山の標高が与えられる
  • 情報に矛盾があれば0、なければありえる山の高さの場合の数を出力

    方針

  • 各山についてあり得る標高の種類を記録しておいて後で掛ける
  • i番目のデータで最高標高が更新されていたら1通りに確定
  • 確定しない場合はその時点での標高通りの組み合わせがある。右からと左からで低い方
  • 左から確定した山の高さを使って、右から見たときの最高標高が確定値よりも低かったら矛盾

    コード

#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;

ll T[100001], A[100001];
ll cand[100001], kaku[100001];
ll mod = 1000000007;
int main(void) {
    int N;
    bool flag = true;
    cin >> N;
    REP(i, N) cin >> T[i];
    REP(i, N) cin >> A[i];
    if(T[N-1] != A[0]) {
        cout << 0 << endl;
        return 0;
    }
    cand[0] = 1;
    FOR(i, 1, N) {
        if(T[i] > T[i-1]) {
            cand[i] = 1;
            kaku[i] = T[i];
        }
        else {
            cand[i] = T[i];
            kaku[i] = -1;
        }
    }
    cand[N-1] = 1;
    for(int i=N-2; i>=0; --i) {
        if(kaku[i] != -1 && A[i] < kaku[i]) {
            flag = false;
            break;
        }
        if(A[i] > A[i+1]) cand[i] = 1;
        else cand[i] = min(cand[i], A[i]);
    }
    if(flag == false) {
        cout << 0 << endl;
        return 0;
    }

    ll ans = 1;
    REP(i, N) {
        ans = (ans*cand[i])%mod;
    }
    cout << ans << endl;
}

Submission #944505 - CODE FESTIVAL 2016 qual C | AtCoder

D, E

解けない