LoginSignup
0
0

More than 3 years have passed since last update.

abc 095 累積dp

Last updated at Posted at 2018-10-28

C
ファーストフードチェーン「ピザアット」のメニューは「A ピザ」「B ピザ」「AB ピザ」の 3 種類です。A ピザと B ピザは全く異なるピザで、これらをそれぞれ半分に切って組み合わせたものが AB ピザです。A ピザ、B ピザ、AB ピザ 1 枚あたりの値段はそれぞれ A 円、B 円、C 円です。
中橋くんは、今夜のパーティーのために A ピザ X 枚と B ピザ Y 枚を用意する必要があります。これらのピザを入手する方法は、A ピザや B ピザを直接買うか、AB ピザ 2 枚を買って A ピザ 1 枚と B ピザ 1 枚に組み替える以外にはありません。このためには最小で何円が必要でしょうか?なお、ピザの組み替えにより、必要な量を超えたピザが発生しても構いません。

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
int main() {
    int A, B, C, X, Y;
    cin >> A >> B >> C >> X >> Y;
    if (A + B < 2*C) {
        cout << A * X + B * Y << endl;
    }
    else {
        if (X < Y) {
            int ans1 = 2 * Y*C;
            int ans2 = 2 * X*C + (Y - X)*B;
            if (ans1 < ans2)
                cout << ans1 << endl;
            else
                cout << ans2 << endl;
        }
        else {
            int ans3 = 2 * X*C;
            int ans4 = 2 * Y*C + (X - Y)*A;
            if (ans3 < ans4)
                cout << ans3 << endl;
            else
                cout << ans4 << endl;
        }
    }
    return 0;
}

Cにしては優しめ?

D

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
#include<stdio.h>
#include<string.h>
#include<iomanip>
using namespace std;
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define REP(i, n) FOR(i, 0, n - 1)
#define NREP(i, n) FOR(i, 1, n)
using ll = long long;
using pii = pair<int, int>;
using piii = pair<pii, pii>;
const ll dx[4] = { 0, -1, 1, 0 };
const ll dy[4] = { -1, 0, 0, 1 };
const int INF = 1e9 + 7;
int gcd(int x, int y) {
    if (x < y)swap(x, y);
    if (y == 0)return x;
    return gcd(y, x%y);
}
////////////////////////////////////////

int main() {
    ll N, C;
    cin >> N >> C;
    vector<ll>x(N + 2), v(N + 2);
    for (int i = 1; i <= N; ++i) {
        cin >> x[i] >> v[i];
    }
    x[0] = 0;
    x[N + 1] = C;
    ll cal = 0;
    vector<vector<ll>>dp(2, vector<ll>(100010, 0));
    for (ll i = 1; i <= N; ++i) {
        cal -= x[i] - x[i - 1];
        cal += v[i];
        dp[0][i] = max(dp[0][i - 1], cal);
    }
    //ここでそれまでのカロリーの最大値をメモ
    cal = 0;
    for (ll i = N; i >= 1; --i) {
        cal -= x[i + 1] - x[i];
        cal += v[i];
        dp[1][i] = max(dp[1][i + 1], cal);
    }
    ll maxcal = 0;
    for (ll i = 0; i <= N; ++i) {
        cal = dp[0][i] + dp[1][i + 1] - x[i];
        maxcal = max(maxcal, cal);
        cal = dp[0][i] + dp[1][i + 1] - C + x[i + 1];
        maxcal = max(maxcal, cal);
    }
    cout << maxcal << endl;
    return 0;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0