当前位置:   article > 正文

Educational Codeforces Round 104 Div. 2 A~E_codeforces educational 104

codeforces educational 104


传送门: https://codeforces.com/contest/1487

A-Arena

输 出 n − 最 小 数 的 个 数 。 输出n-最小数的个数。 n

Code

#include "bits/stdc++.h"

using namespace std;

void solve() {
    int _; cin >> _;
    while(_--) {
        int n; cin >> n;
        map<int, int> mp;
        int mx = 1e9;
        for(int i = 1;i <= n; i++) {
            int x; cin >> x;
            mp[x]++;
            mx = min(mx, x);
        }
        cout << n - mp[mx] << endl;
    }
}

signed main() {
    solve();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

B - Cat Cycle

因 为 猫 B 首 先 呆 在 1 的 位 置 , 所 以 k 要 减 1 , 最 后 位 置 加 1 即 可 。 因为猫B首先呆在1的位置,所以k要减1,最后位置加1即可。 B1k11

当 n 为 奇 数 时 , 直 接 输 出 ( k − 1 ) % n + 1 当n为奇数时,直接输出(k-1)\%n+1 n(k1)%n+1
当 n 为 偶 数 时 , 因 为 会 有 相 遇 问 题 。 当n为偶数时,因为会有相遇问题。 n
而 相 遇 时 间 为 ( n − 1 ) / 2 , 总 相 遇 次 数 为 ( k − 1 ) ( n − 1 ) / 2 。 而相遇时间为(n-1)/2,总相遇次数为\frac{(k-1)}{(n-1)/2}。 (n1)/2(n1)/2(k1)
最 后 位 置 为 ( k − 1 + ( k − 1 ) ( n − 1 ) / 2 ) % n + 1 。 最后位置为(k-1+\frac{(k-1)}{(n-1)/2})\%n+1。 (k1+(n1)/2(k1))%n+1

Code

#include "bits/stdc++.h"

using namespace std;

void solve() {
    int _; cin >> _;
    while(_--) {
        int n, k; cin >> n >> k;
        k -= 1;
        if(n & 1) {
            cout << (k + k / ((n - 1) / 2)) % n + 1 << endl;
        }
        else cout << k % n + 1 << endl;
    }
}

signed main() {
    solve();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

C - Minimum Ties

当 n 为 奇 数 时 , 那 么 每 个 队 都 是 n 2 的 赢 和 输 。 所 以 输 出 1 、 − 1 、 1... 即 可 。 当n为奇数时,那么每个队都是\frac{n}{2}的赢和输。所以输出1、-1、1...即可。 n2n111...

当 n 为 偶 数 时 , 那 么 每 个 队 都 是 n 2 − 1 的 赢 和 输 还 有 一 场 平 局 。 当n为偶数时,那么每个队都是\frac{n}{2}-1的赢和输还有一场平局。 n2n1

平 局 场 就 是 1 和 2 , 3 和 4 , 5 和 6 等 等 。 剩 下 场 都 是 一 半 赢 一 半 输 。 平局场就是1和2,3和4,5和6等等。剩下场都是一半赢一半输。 123456

Code

#include "bits/stdc++.h"

using namespace std;

void solve() {
    int _; cin >> _;
    while(_--) {
        int n; cin >> n;
        if(n & 1) {
            for(int i = 1;i <= (n - 1) * n / 2; i++) {
                if(i & 1) cout << 1 << " ";
                else cout << -1 << " ";
            }
        }
        else {
            int t = 0;
            while(n--) {
                t++;
                for(int i = 1;i <= n; i++){
                    if(i == 1 && (t & 1)) cout << 0 << " ";
                    else {
                        if(!(i & 1)) cout << 1 << " ";
                        else cout << -1 << " ";
                    }
                }
            }
        }
        cout << endl;
    }
}

signed main() {
    solve();
}

  • 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

D - Pythagorean Triples

三 个 条 件 : 三个条件:

  • c = a 2 − b c=a^2-b c=a2b
  • c 2 = a 2 + b 2 c^2=a^2+b^2 c2=a2+b2
  • 1 ≤ a , b , c ≤ n 1\leq a,b,c\leq n 1a,b,cn

问 这 样 ( a , b , c ) 的 组 数 有 多 少 ? 问这样(a,b,c)的组数有多少? (a,b,c)

来 化 简 一 下 , 二 式 − 一 式 得 c 2 − c = b 2 + b            ( c + b ) ( c − b ) = b + c 来化简一下,二式-一式得c^2-c=b^2+b\;\;\;\;\;(c+b)(c-b)=b+c c2c=b2+b(c+b)(cb)=b+c
继 续 化 简 c − b = 1      b = c − 1 , 带 入 一 式 得 2 c = a 2 + 1 。 继续化简c-b=1\;\;b=c-1,带入一式得2c=a^2+1。 cb=1b=c12c=a2+1

所 以 整 个 条 件 就 变 为 , a 一 定 要 是 奇 数 , 并 且 a ≤ n , 得 : 所以整个条件就变为,a一定要是奇数,并且a\leq n,得: aan

a n s = ⌈ 2 ∗ n − 1 2 ⌉ − 1 ans=\left \lceil \frac{\sqrt{2*n-1}}{2} \right \rceil-1 ans=22n1 1

这 个 减 1 是 因 为 c = 1 时 , b = 0 , 错 误 组 。 这个减1是因为c=1时,b=0,错误组。 1c=1b=0

Code

#include "bits/stdc++.h"

using namespace std;

typedef long long ll;

void solve() {
    int _; cin >> _;
    while(_--) {
        ll n; cin >> n;
        ll a = sqrt(2 * n - 1);
        cout << a / 2 + (a % 2 == 1) - 1 << endl;
    }
}

signed main() {
    solve();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

E - Cheap Dinner

因为限制只在相邻的两种食物之间,所以我们可以把这个问题分割成三个子问题:对于每种第二种食物来说,与他能在一起且价格最低的食物是谁,对于第三种和第四种同理求即可,最后把答案合并起来。那么如何找最小值,并且在限制关系中又可以有删除的操作呢,就可以用map实现。

Code

#include "bits/stdc++.h"

using namespace std;

#define endl "\n"
#define pb push_back

vector<int> a[5], n(5);
vector<pair<int, int>> que, tt;
map<int, set<int>> mp[5];

void solve() {
    for (int i = 1; i <= 4; i++) cin >> n[i], a[i].pb(0);
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= n[i]; j++) {
            int x;
            cin >> x;
            a[i].pb(x);
        }
    }
    for (int i = 1; i <= 3; i++) {
        int m;
        cin >> m;
        for (int j = 1; j <= m; j++) {
            int x, y;
            cin >> x >> y;
            mp[i][x].insert(y);
        }
    }
    for (int i = 1; i <= n[1]; i++) que.pb({a[1][i], i});
    for (int k = 2; k <= 4; k++) {
        sort(que.begin(), que.end());
        for (int i = 1; i <= n[k]; i++) {
            for (auto j : que) {
                int x = j.first, y = j.second;
                if (mp[k - 1][y].find(i) == mp[k - 1][y].end()) {
                    tt.pb({a[k][i] + x, i});
                    break;
                }
            }
        }
        que = tt;
        tt.clear();
    }
    sort(que.begin(), que.end());
    if (que.empty())
        cout << -1 << endl;
    else
        cout << que[0].first << endl;
}

signed main() {
    solve();
}
  • 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
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/519077?site
推荐阅读
相关标签
  

闽ICP备14008679号