ABC 008

abc008.contest.atcoder.jp

A問題

#include <bits/stdc++.h>
 
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
#define RREP(i,n) for(int i=(int)(n); i>=0; --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 S, T;
    cin >> S >> T;
    cout << T-S+1 << endl;
}

Submission #1025991 - AtCoder Beginner Contest 008 | AtCoder

B問題

#include <bits/stdc++.h>
 
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
#define RREP(i,n) for(int i=(int)(n); i>=0; --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;
    map<string, int> S;
    REP(i, N) {
        string s;
        cin >> s;
        S[s]++;
    }
    string name;
    int ans = 0;
    for(map<string, int>::iterator it = S.begin(); it != S.end(); ++it) {
        if(it->second > ans) {
            ans = it->second;
            name = it->first;
        }
    }
    cout << name << endl;
}

Submission #1026002 - AtCoder Beginner Contest 008 | AtCoder

C問題

C問題とは思えない難易度。解説を見てその通りに実装した

#include <bits/stdc++.h>
 
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
#define RREP(i,n) for(int i=(int)(n); i>=0; --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;
    vector<int> C(N);
    REP(i, N) cin >> C[i];
    double ans = 0;
    REP(i, N) {
        int S = 0;
        REP(j, N) {
            if(i != j && C[i] % C[j] == 0) S++;
        }
        if(S%2 == 1) ans += 0.5;
        else ans += double(S+2.0)/(2.0*S+2.0);
    }
    printf("%.10f\n", ans);
}

Submission #1030429 - AtCoder Beginner Contest 008 | AtCoder

D問題

領域内にある採掘機全てについて、「その採掘機で取れる金塊+残りの長方形4つについての最大金塊数」の最大値を求める関数を作ってメモ化再帰。 座標圧縮のためにtupleを使った。

#include <bits/stdc++.h>
#include <tuple>
 
#define REP(i,n) for(int i=0; i<(int)(n); ++i)
#define RREP(i,n) for(int i=(int)(n); i>=0; --i)
#define FOR(i,k,n) for(int i=(k);i<(int)(n);++i)
typedef long long int ll;
using namespace std;
 
int W, H;
int N;
int X[81], Y[81];
 
typedef tuple<int, int, int, int> T;
map<T, int> c;
 
int dp(int i, int j, int w, int h) {
    T t = make_tuple(i, j, w, h);
    if(c.count(t) == 1) return c[t];
    int ret = 0;
    REP(k, N) {
        int s = X[k]; int t = Y[k];
        if(s >= i && s <= w && t >= j && t <= h) {
            ret = max(ret, w+h-i-j+1 + dp(i, j, s-1, t-1) + dp(s+1, j, w, t-1)
                                     + dp(i, t+1, s-1, h) + dp(s+1, t+1, w, h));
        }
    }
    return (c[t] = ret);
}
 
int main(void) {
    cin >> W >> H;
    cin >> N;
    REP(i, N) cin >> X[i] >> Y[i];
    cout << dp(1, 1, W, H) << endl;
}

Submission #1033456 - AtCoder Beginner Contest 008 | AtCoder