zoukankan      html  css  js  c++  java
  • Codeforces Round #733 (Div. 1 + Div. 2)

    比赛链接:Here

    1530A. Binary Decimal

    现在规定一种只由0和1组成的数字,我们称这种数字为二进制数字,例如10,1010111,给定一个数n,求该数字最少由多少个二进制数字组成.


    水题,

    每取一个二进制数字,可以使得原数字n上各位都减小1或者0,为了使次数尽可能地小,那么当原数字n上各位不为0的时候都应该-1,那么最小的次数就是各位上最大的数字

    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        int _; for (cin >> _; _--;) {
            string s; cin >> s;
            int cnt = s[0] - '0';
            for (int i = 1; i < s.size(); ++i)cnt = max(s[i] - '0', cnt);
            cout << cnt << "
    ";
        }
    }
    

    1530B. Putting Plates

    给定一个高为h,宽为w的网格,你可以在网格的四个边缘处,放置一个盘子,每个盘子的四周都不能有别的盘子(四周指的是最近的8个格子),请输出一个种安排方式.


    构造模拟题,首先为了使个数尽可能多,那么一定是从第一个开始放置,然后检测后面是否合法,如果合法就放下盘子,如果不合法就跳过.

    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        int _; for (cin >> _; _--;) {
            int n, m;
            cin >> n >> m;
            vector<std::string> s(n, string(m, '0'));
            for (int i = 0; i < m; i += 2) {
                s[0][i] = '1';
            }
            for (int i = 1; i < n; i++) {
                if (s[i - 1][m - 1] != '1' && s[i - 1][m - 2] != '1') {
                    s[i][m - 1] = '1';
                }
            }
            for (int i = m - 2; i >= 0; i--) {
                if (s[n - 1][i + 1] != '1' && s[n - 2][i + 1] != '1') {
                    s[n - 1][i] = '1';
                }
            }
            for (int i = n - 2; i > 1; i--) {
                if (s[i + 1][0] != '1' && s[i + 1][1] != '1') {
                    s[i][0] = '1';
                }
            }
     
            for (int i = 0; i < n; i++) {
                cout << s[i] << "
    ";
            }
        }
    }
    

    1530C. Pursuit

    二分,

    给t组样例
    每组样例给n个数
    a[1] , a[2] , a[3] ...... a[n]
    b[1] , b[2] , b[3] ...... b[n]
    数据保证(0 <= a[i] , b[i] <= 100 , t组样例n的总和小于1e5)
    a[i]表示第一个人在i这个阶段的分数
    b[i]表示第二个人在i这个阶段的分数

    现在只给了n个阶段每个人的分数
    后面若干个阶段的分数值0到100之间都有可能

    现在定义一个人在i这个阶段的得分为
    从i个分数中取出 i - i / 4 个最大的分数相加即为
    在i阶段的分数

    问在n这个阶段是否第一个人的得分大于第二个人的得分
    如果可以输出0
    如果不行输出最少加几个阶段
    使得第一个人的得分大于等于第二个人的得分

    const int N = 1e6 + 10;
    int a[N], b[N];
    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        int _; for (cin >> _; _--;) {
            int n;
            cin >> n;
            for (int i = 1; i <= n; ++i)cin >> a[i];
            for (int i = 1; i <= n; ++i)cin >> b[i];
            sort(a + 1, a + 1 + n);
            sort(b + 1, b + 1 + n);
     
            auto check = [&](int k) {
                int m = n + k, rm = m - m / 4;
                int A = 0, B = 0;
                for (int i = 1; i <= k; ++i) a[n + i] = 100;
                for (int i = m; i > m - rm; --i)A += a[i];
                for (int i = n; i > max(0, n - rm); --i)B += b[i];
                return A >= B;
            };
     
            if (check(0))cout << "0
    ";
            else {
                int l = 0, r = n;
                while (r - l > 1) {
                    ll mid = (l + r) >> 1;
                    if (check(mid))r = mid;
                    else l = mid;
                }
                cout << r  << "
    ";
            }
        }
    }
    

    当然既然要让a的分数要大于等于b的分数

    那么a[n+1] , a[n+2] , a[n+3] ......都应该是100

    b[n+1] , b[n+2] , b[n+3] ....... 都应该是0

    所以从大到小排序之后 用前缀和优化到 (mathcal{O}(n)) 也是可以做的

    1530D. Secret Santa

    图论,

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    
    // jiangly TQL
    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        int _; for (cin >> _; _--;) {
            int n;
            cin >> n;
    
            int ans = 0;
            vector<int> a(n), b(n, -1), c(n, -1);
            for (int i = 0; i < n; i++) {
                cin >> a[i];
                a[i]--;
                if (c[a[i]] < 0) {
                    b[i] = a[i];
                    c[a[i]] = i;
                    ans++;
                }
            }
    
            vector<int> u, v;
            for (int i = 0; i < n; i++) {
                if (c[i] >= 0)  continue;
                int j = i;
                while (b[j] >= 0)  j = b[j];
                u.push_back(i);
                v.push_back(j);
            }
    
            if (!u.empty()) {
                if (u.size() > 1 || u[0] != v[0]) {
                    for (int i = 0; i < int(u.size()); i++)
                        b[v[i]] = u[(i + 1) % u.size()];
                } else {
                    int x = u[0];
                    int y = a[x];
                    b[x] = y;
                    b[c[y]] = x;
                }
            }
    
            cout << ans << "
    ";
            for (int i = 0; i < n; i++)
                cout << b[i] + 1 << " 
    "[i == n - 1];
        }
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    命令拷屏之网络工具
    PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 LeetCode 143 重排链表
    Java实现 LeetCode 143 重排链表
  • 原文地址:https://www.cnblogs.com/RioTian/p/15034613.html
Copyright © 2011-2022 走看看