LoginSignup
1
0

More than 3 years have passed since last update.

モギモギ 2nd 解説

Last updated at Posted at 2020-10-12

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;
  }
}
1
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
1
0