JOI2020/2021 一次予選 一回目参加・解説
はじめに
この記事の問題名、入力の情報は日本情報オリンピック委員会に帰属し、CC4.0 BY-SAで提供されています。 また本記事はCC4.0 BY-SAを継承しています
A問題 (2番めに大きい整数)
このA問題ですが、まあよく見る感じな気がします。解法としては、
- 配列に入れてソートして出力
- $ (A+B+C) - (\min({a,b,c}) + \max({a,b,c})) $を出力
などがあります
ACしたコードはこちら
//前略 // int main() { cin.tie(nullptr) ; ios::sync_with_stdio(false) ; int a, b, c; cin >> a >> b >> c; cout << (a + b + c) - (max({a, b, c}) + min({a, b, c})) << "\n"; return 0; }
B問題(JOIソート)
問題名にソートって付いてますが、文字列をソートすると'I'<'J'<'O'なのでだめ。
問題から、J...JI...IO...Oの形になればいいので、各、J,O,Iの個数を数えてあげれば問題ないのがわかります。
ACコードはこちら
//前略 // int main() { cin.tie(nullptr) ; ios::sync_with_stdio(false) ; int n; string s; cin >> n >> s; ll j = 0; ll o = 0; ll i = 0; for(auto c : s){ if (c == 'J') j++; if (c == 'O') o++; if (c == 'I') i++; } cout << string(j,'J') << string(o,'O') << string(i,'I') << "\n"; return 0; }
C問題(共通要素)
共通要素を求めて、昇順に出力すればいいです。find()を使いましたが、count()でも問題なさそうです
ACコードはこちら
#include <bits/stdc++.h> #define rep(i, n) for (long long i = 0; i < (n); ++i) #define all(v) v.begin(), v.end() using namespace std; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n, m; cin >> n >> m; vector<int> a(n, 0); rep(i, n) cin >> a[i]; vector<int> b(m, 0); rep(i, m) cin >> b[i]; set<int> res; rep(i, n) { if (find(all(b), a[i]) != b.end()) res.insert(a[i]); } for (auto r : res) cout << r << "\n"; return 0; }
終わりに
一次予選は去年二次行った人は出る必要がなかったんですが、楽しそうなので出ました。
去年同様、ABC-A,ABC-Bぐらいが出てるような気がしました