This page looks best with JavaScript enabled

 ·  ☕ 4 min read · 👀... views

libraries:

  • mathjax

title: “ABC170大反省会 Eまで”
date: 2020-06-16T18:40:38+09:00
author: reud
slug: ac37fa54aad0b834d8b33698d9b77e40
categories:

  • AtCoder
  • ABC
    libraries:
  • mathjax

どうしてこうなった。。。。

A - Five Variables

入力をfor文で回すと、その入力が何個目なのか分かるようになります。

また、入力を全て受け取らずにプログラムが終了しても出力結果が正しければ問題はないです。

提出 #14409772 - AtCoder Beginner Contest 170

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

#define REPR(i,n) for(int i=(n); i >= 0; --i)
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define ALL(a)  (a).begin(),(a).end()
#define endl "\n"

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
typedef long long ll;

void solve() {
    REP(i,5) {
        int x;
        cin >> x;
        if(!x) {
            cout << i+1 << endl;
            return;
        }
    }
}

int main() {
    solve();
    return 0;
}

B - Crane and Turtle

つるかめ算です。

庭の動物に鶴が$x$匹、亀が$y$匹居るとしましょう。以下の数式が成り立ちます。

$$
x+y = X
$$

$$
2x+4y = Y
$$

連立方程式になりますので$x,y$を$X,Y$で表すことが可能です。
式変形をすると、

$$
y = \frac{Y - 2X}{2}
$$
$$
x = \frac{4X-Y}{2}
$$

後は$x,y$を算出して正しいかどうか確認すれば良いでしょう。

提出 #14410241 - AtCoder Beginner Contest 170

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

#define REPR(i,n) for(int i=(n); i >= 0; --i)
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define ALL(a)  (a).begin(),(a).end()
#define endl "\n"

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
typedef long long ll;

void solve() {
    int X,Y;
    cin >> X >> Y;
    auto ty = Y - 2*X ;
    if(ty%2 == 1) {
        cout << "No" << endl;
        return;
    }
    auto y = ty/2;
    auto x = X - y;
    if ((x < 0) || (y < 0)  || ((2*x+4*y) != Y)) {
        cout << "No" << endl;
        return;
    }
    cout << "Yes" << endl;

}

int main() {
    solve();
    return 0;
}

C - Forbidden List

数列の要素の取る範囲が小さいことに着目します。1~100となっています。

また、Xに着目すると1~100になっています。

このことから、答えの最大最小は0,101になると分かります。

答えになりうる範囲が狭いので0から101まで全てに対して答えとした時のXの絶対値を求めれば良いです。
答えとした時のXの絶対値をINFに設定しておいて、for中で更新された場合にその答えを保存する処理を書けば、
問題に対する答えを用意できます。

chminマクロを持っておくと便利で良いぞ

提出 #14410474 - AtCoder Beginner Contest 170

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

#define REPR(i,n) for(int i=(n); i >= 0; --i)
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define ALL(a)  (a).begin(),(a).end()
#define endl "\n"

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
typedef long long ll;

void solve() {
    int X,N;
    cin >> X >> N;
    set<int> p;
    REP(i,N) {
        int x; cin >> x;
        p.insert(x);
    }
    int mini = INF;
    int ans = -1;
    REP(i,102)  if( !(p.count(i)) && chmin(mini,abs(X-i)) ) ans = i;
    cout << ans << endl;
}

int main() {
    solve();
    return 0;
}

D - Not Divisible

ここから解けないシリーズ。

解説もくそむずい

intの集合huruiとstを容易します。

stは入力される要素Aiを格納します。huruiは後述。

以下の二つの処理をstの中の要素aについて行います。(int ans=0とします。)

1-1. aはAの中に何個出ているか確認する。二つ以上出ているなら1-2を飛ばす。
1-2. huruiにaが含まれているか確認する。含まれていなければans++

  1. Aの集合の要素aについて 正の整数で ka <= max(A) を満たすkについて、 huruiにka入れていく。

これで解けます。 1-2 時点でhuruiに入っていなければ要素aは他の要素(bとします。)を用いて任意の整数kを使って a ≠ b*k が成立し、(重複チェックが通れば)
条件を満たします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

#define REPR(i,n) for(int i=(n); i >= 0; --i)
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define ALL(a)  (a).begin(),(a).end()
#define endl "\n"

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
typedef long long ll;


void solve() {
    int N;
    cin >> N;
    map<int,int> mp; // 重複カウンタ用, 値が2以上の場合は答えに含まれない
    set<int> st; // 値のset
    set<int> hurui; // (値,存在しない: 値の約数はそれのみ, 存在する: 値の約数が<集合stから自身を除いたもの>の中に存在する。)
    REP(i,N) {
        int a; cin >> a;
        st.insert(a);
        if(mp.count(a) == 0) mp[a] = 0;
        mp[a]++;
    }
    auto maxel = *max_element(ALL(st));
    int ans = 0;
    for(const auto &a: st) {
        // 存在しないなら値の約数はそれのみなので、重複カウンタもおkだったら答えとなる。
        if((!hurui.count(a)) && (mp[a] < 2) ) ans++;
        int ax = a,i = 0;
        while((ax*(i+1)) <= maxel) {
            i++;
            hurui.insert(ax*i);
        }
    }
    cout << ans << endl;
}

int main() {
    solve();
    return 0;
}

E - Smart Infants

最高に楽しいが書くことがねぇ・・・・ multisetが良い感じに作用するのと、何を持つのかを考えると良いかも。
set使うなら最大最小はrbeginとかで取ってきた方が圧倒的に計算量はへるぞい

提出 #14468963 - AtCoder Beginner Contest 170

Share on

reud
WRITTEN BY
reud
Stundent