ABC 005

abc005.contest.atcoder.jp

A問題

#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 x, y;
    cin >> x >> y;
    cout << y / x << endl;
}

Submission #1024248 - AtCoder Beginner Contest 005 | AtCoder

B問題

#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;
    vector<int> T(N);
    REP(i, N) cin >> T[i];
    sort(T.begin(), T.end());
    cout << T[0] << endl;
}

Submission #1024251 - AtCoder Beginner Contest 005 | AtCoder

C問題

#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 T, N, M;
    cin >> T >> N;
    vector<int> A(N);
    REP(i, N) cin >> A[i];
    cin >> M;
    vector<int> B(M);
    REP(i, M) cin >> B[i];
 
    bool ok = true;
    if(M > N) ok = false;
 
    int idx = 0;
    REP(i, M) {
        bool serve = false;
        while(idx < N && A[idx] < B[i] - T) idx++;
        if(A[idx] >= B[i] - T && A[idx] <= B[i]) {
            idx++;
        } else {
            ok = false;
        }
    }
    cout << (ok ? "yes" : "no") << endl;
}

Submission #1024261 - AtCoder Beginner Contest 005 | AtCoder

D問題

  • 左上(0, 0)右下(i, j)の長方形のおいしさの和をacc[i][j]に入れる。 O(N^2)
  • (x, y, w, h)を指定したらその長方形のおいしさの和を返す関数がarea O(1)
  • 全ての高さ・幅の長方形に対して最大のおいしさを求める。 O(N^4)
  • 各たこ焼き数以下で達成できる最大のおいしさを求める。 O(N^2)
  • 以上の準備をすれば、各店員の焼けるたこ焼き数に対する最大のおいしさが O(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;
 
int D[55][55];
int acc[55][55];
int P[2501];
int memo[2501];
 
int area(int x, int y, int w, int h) {
    return acc[x+w][y+h] - acc[x+w][y] - acc[x][y+h] + acc[x][y];
}
 
int main(void) {
    int N, Q;
    cin >> N;
    REP(i, N) REP(j, N) cin >> D[i][j];
    cin >> Q;
    REP(i, Q) cin >> P[i];
 
 
    REP(j, N+1) acc[0][j] = 0;
    FOR(i, 1, N+1) {
        int row = 0;
        acc[i][0] = 0;
        FOR(j, 1, N+1) {
            row += D[i-1][j-1];
            acc[i][j] = acc[i-1][j] + row;
        }
    }
    REP(i, 2501) memo[i] = 0;
    REP(w, N+1) {
        REP(h, N+1) {
            REP(x, N-w+1) {
                REP(y, N-h+1) {
                    memo[w*h] = max(memo[w*h], area(x, y, w, h));
                }
            }
        }
    }
    FOR(i, 1, 2501) memo[i] = max(memo[i], memo[i-1]);
    REP(i, Q) cout << memo[P[i]] << endl;
}

Submission #1025052 - AtCoder Beginner Contest 005 | AtCoder