ABC 125
A
B*T/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() { int A, B, T; cin >> A >> B >> T; cout << B * (T / A) << endl; }
Submission #5139315 - AtCoder Beginner Contest 125
B
V[i]-C[i] > 0
となるV[i]-C[i]
の総和
#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() { int N; vector<int> V(N), C(N); cin >> N; REP(i, N) cin >> V[i]; REP(i, N) cin >> C[i]; int ans = 0; REP(i, N) { if (V[i] > C[i]) ans += V[i] - C[i]; } cout << ans << endl; }
Submission #5141279 - AtCoder Beginner Contest 125
C
- 左端から順・右端から順に最大公約数を取った配列を
L[i]
,R[i]
として持っておく - 左端を除いた最大公約数は
R[1]
, 右端を除いた最大公約数はL[N-2]
, 端以外のi
番目を除いた最大公約数はgcd(L[i-1], R[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 gcd(ll a, ll b) { if (b == 0) return a; return gcd(b, a % b); } int main() { int N; cin >> N; vector<int> A(N), L(N), R(N); REP(i, N) cin >> A[i]; L[0] = A[0]; R[N - 1] = A[N - 1]; FOR(i, 1, N) { L[i] = gcd(L[i - 1], A[i]); R[N - 1 - i] = gcd(R[N - i], A[N - 1 - i]); } ll ans = max(R[1], L[N - 2]); FOR(i, 1, N - 1) { ans = max(ans, gcd(L[i - 1], R[i + 1])); } cout << ans << endl; }
D
- 相変わらずDが解けない
dp[i][0]
をi
を選んで反転させない場合、dp[i][1]
をi
を選んで反転させた場合の最大値とする。- このとき
dp[i+1][0] = max(dp[i][0]+A[i], dp[i][1]-A[i])
,dp[i+1][1] = max(dp[i][0]-A[i], dp[i][1]+A[i])
になる。i
を選んで操作しないとき、i-1
を選んで操作していなかったらi
はそのままで、i-1
を操作していたらi
は反転している。i
を選んで操作するとき、i-1
を選んで操作していなかったらi
は反転していて、i-1
を操作していたらi
はそのまま。
- 答えは
dp[N][0]
(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 N; ll dp[100001][2]; int main() { cin >> N; vector<ll> A(N); REP(i, N) { cin >> A[i]; } dp[0][0] = 0; dp[0][1] = numeric_limits<ll>::min() / 2; FOR(i, 1, N + 1) { dp[i][0] = max(dp[i - 1][0] + A[i - 1], dp[i - 1][1] - A[i - 1]); dp[i][1] = max(dp[i - 1][0] - A[i - 1], dp[i - 1][1] + A[i - 1]); } cout << dp[N][0] << endl; }