spadyのメモ帳

技術ブログにしたいけどどうなることやら。まだ素人

JOI2020/2021 一次予選 一回目参加・解説

はじめに

この記事の問題名、入力の情報は日本情報オリンピック委員会に帰属し、CC4.0 BY-SAで提供されています。 また本記事はCC4.0 BY-SAを継承しています

img

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ぐらいが出てるような気がしました