A. キャンディーと2人の子供 / Fighting over Candies
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> a(3);
cin >> a.at(0) >> a.at(1) >> a.at(2);
// 小さい順に並び替え
sort(a.begin(), a.end());
// 小さい2つと一番大きいものを比較して同じ値なら2人で分けることが可能。
if(a.at(0) + a.at(1) == a.at(2)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
A. Infinite Coins
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a;
cin >> n >> a;
// 500円玉で可能な限り払うと残りの払うべき金額は n を 500 で割ったあまりになる。
// そのあまりがA円以下であれば所持しているお金でちょうど払い切ることが可能
if(n % 500 <= a) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
B. Long Long Ago
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n);
for(int i = 0; i < n; i++) cin >> a.at(i);
// ansは結婚最有力候補の人の番号
// ansAgoは結婚最有力候補の人のアゴの長さ
int ans = -1;
int ansAgo = 0;
for(int i = 0; i < n; i++) {
// 現状の結婚最有力候補の人とり顎が長く、
// 王様よりも短い人がいればその人を最有力候補にする。
// (番号とアゴの長さの更新)
if(ansAgo < a.at(i) && a.at(i) < k) {
ans = i + 1;
ansAgo = a.at(i);
}
}
cout << ans << endl;
}
A. Frog 1
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> h(n);
for(int i = 0; i < n; i++) cin >> h.at(i);
// 各地点までの最短経路の値を格納していく配列
// (ゼロ値で初期化されるのでdpの各要素の中身は0)
vector<long long> dp(n);
for(int i = 1; i < n; i++) {
// i == 1 のときは1つ前の地点との距離の差の絶対値を格納
// それ以外では、『1つ前までの最短距離(dp)と1つ前の地点との距離の差の絶対値の和』と
// 『2つ前までの最短距離(dp)と2つ前の地点との距離の差の絶対値の和』から小さい方を格納
// dp.at(i) : i地点にたどり着くまでの最短経路
// abs(dp.at(i) - dp.at(j)) : i地点からj地点までにいくまでのコスト
if(i == 1) {
dp.at(i) = abs(h.at(i) - h.at(i-1));
} else {
dp.at(i) = min(dp.at(i-1) + abs(h.at(i) - h.at(i-1)), dp.at(i-2) + abs(h.at(i) - h.at(i-2)));
}
}
cout << dp.at(n-1) << endl;
}
C. GeT AC
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, q;
string s;
cin >> n >> q >> s;
// これは n 文字目までに "AC" が出現した回数を格納する配列
vector<int> cusum(n);
for(int i = 1; i < n; i++) {
// ACが出たなら 直前までに出た回数に1を加算した後を格納
// 出ないのであれば 直前までに出た回数をそのまま格納
if(s.at(i-1) == 'A' && s.at(i) == 'C') {
cusum.at(i) = cusum.at(i-1) + 1;
} else {
cusum.at(i) = cusum.at(i-1);
}
}
for(int i = 0; i < q; i++) {
int l, r;
cin >> l >> r;
// r文字目までに出た回数からl文字目までに出た回数をそのまま引く。
cout << cusum.at(r-1) - cusum.at(l-1) << endl;
}
}