• 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
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    信息分析与预测复习(其它资料)
    计算斐波那契分数序列前n项之和(n是某个常数,波那契分数序列为2/1,3/2,5/3,8/5,...)
    做男人难(转)
    牢记这一刻
    二分法求方程2x34x2+3x=0在(10,10)附近的根
    求水仙花数
    iOS面试题
    【转】【翻译】在Entity Framework 4.0中使用 Repository 和 Unit of Work 模式
    【转】【翻译】实体框架中的POCO支持 第三部分 POCO的变动跟踪
    【转】EntityFramework之领域驱动设计实践:总结
  • 原文地址:https://www.cnblogs.com/RioTian/p/15034613.html
Copyright © 2020-2023  润新知