• Codeforces Round #595 (Div. 3)


    Codeforces Round #595 (Div. 3)

    A. Yet Another Dividing into Teams

    • 思路:排序后找是否有两个相邻的数差值为1即可

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    const int N = 110;
    
    int q, n;
    int a[N];
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin >> q;
        while (q -- ){
            cin >> n;
            for (int i = 1; i <= n; i ++ )
                cin >> a[i];
            sort(a + 1, a + n + 1);
            bool flag = false;
            for (int i = 1; i < n; i ++ ){
                if (a[i] == a[i + 1] - 1){
                    flag = true;
                    break;
                }
            }
            if (flag)
                cout << 2 << "
    ";
            else
                cout << 1 << "
    ";
        }
        return 0;
    }
    

    B2. Books Exchange (hard version)

    • 思路:dfs找环

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    ll lcm(ll a, ll b){
        return a / gcd(a, b) * b;
    }
    
    const int N = 2e5 + 10;
    
    int q, n;
    int p[N], ans[N];
    
    int calc(int st, int now, int to, int step){
        if (st == to)
            return ans[now] = step;
        return ans[now] = calc(st, to, p[to], step + 1);
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin >> q;
        while (q -- ){
            memset(ans, 0, sizeof(ans));
            cin >> n;
            for (int i = 1; i <= n; i ++ )
                cin >> p[i];
            for (int i = 1; i <= n; i ++ )
                if (!ans[i])
                    calc(i, i, p[i], 1);
            for (int i = 1; i <= n; i ++ ){
                if (i != n)
                    cout << ans[i] << " ";
                else
                    cout << ans[i] << "
    ";
            }
        }
        return 0;
    }
    
    

    C2. Good Numbers (hard version)

    • 思路:转换为三进制 每一位(geq2)的当前位清零 下一位(+1) 并标记 然后把标记位之前的全部清零 再转换成十进制就行了 没写标记位直接将最高位之前清零导致wa6(逃

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    const int N = 100;
    
    int q;
    ll n, ans;
    int t[N];
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin >> q;
        while (q -- ){
            memset(t, 0, sizeof(t));
            ans = 0;
            cin >> n;
            int cnt = 0;
            ll tmp = n;
            while (tmp){
                tmp /= 3;
                t[cnt ++ ] = n - 3 * tmp;
                n = tmp;
            }
            int flag = -1;
            for (int i = 0; i < cnt; i ++ ){
                if (t[i] >= 2){
                    flag = i;
                    t[i] = 0;
                    t[i + 1] ++ ;
                }
            }
            if (flag != -1){
                for (int i = 0; i < flag; i ++ )
                    t[i] = 0;
            }
            ll fac = 1;
            for (int i = 0; i <= cnt; i ++ ){
                ans += t[i] * fac;
                fac *= 3;
            }
            cout << ans << "
    ";
        }
        return 0;
    }
    

    D2. Too Many Segments (hard version)

    • 思路:看了其他dalao博客的思路 将所有线段用set维护 然后从小到大枚举端点 将左端点覆盖到这个点的线段加入set中 然后线段数量大于k时移除右端点最大的线段 最后将右端点等于这个点的线段全部移除 (太妙了

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    ll lcm(ll a, ll b){
        return a / gcd(a, b) * b;
    }
    
    typedef pair<ll, ll> pii;
    
    const int N = 2e5 + 10;
    
    int n, k, l, r;
    vector<pii> vec[N];
    vector<int> ans;
    set<pii> st;
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin >> n >> k;
        for (int i = 1; i <= n; i ++ ){
            cin >> l >> r;
            vec[l].push_back({r, i});
        }
        for (int i = 0; i < N; i ++ ){
            for (int j = 0; j < vec[i].size(); j ++ )
                st.insert(vec[i][j]);
            while (st.size() > k){
                ans.push_back(st.rbegin() -> second);
                st.erase( -- st.end());
            }
            while (!st.empty() && st.begin() -> first == i){
                st.erase(st.begin());
            }
        }
        cout << ans.size() << "
    ";
        for (int i = 0; i < ans.size(); i ++ ){
            if (i != ans.size() - 1)
                cout << ans[i] << " ";
            else
                cout << ans[i] << "
    ";
        }
        return 0;
    }
    
    /*
    7 2
    11 11
    9 11
    7 8
    8 9
    7 8
    9 11
    7 9
    
    3
    7 4 6
    */
    
    /*
    5 1
    29 30
    30 30
    29 29
    28 30
    30 30
    
    
    3
    4 1 5
    */
    
    /*
    6 1
    2 3
    3 3
    2 3
    2 2
    2 3
    2 3
    
    4
    6 5 3 1
    */
    

    E. By Elevator or Stairs?

    • 思路:比较简单的dp 详细见代码

    • AC代码


    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll mult_mod(ll x, ll y, ll mod){
        return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    
    ll pow_mod(ll a, ll b, ll p){
        ll res = 1;
        while (b){
            if (b & 1)
                res = mult_mod(res, a, p);
            a = mult_mod(a, a, p);
            b >>= 1;
        }
        return res % p;
    }
    
    ll gcd(ll a, ll b){
        return b ? gcd(b, a % b) : a;
    }
    
    ll lcm(ll a, ll b){
        return a / gcd(a, b) * b;
    }
    
    const int N = 2e5 + 10;
    const int M = 3;
    
    int n, c;
    int a[N], b[N];
    int dp[N][M];
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("my_in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin >> n >> c;
        memset(dp, 0x3f, sizeof(dp));
        dp[1][1] = 0, dp[1][2] = c;
        for (int i = 1; i < n; i ++ )
            cin >> a[i];
        for (int i = 1; i < n; i ++ )
            cin >> b[i];
        for (int i = 1; i < n; i ++ ){
            dp[i + 1][1] = min(dp[i + 1][1], dp[i][1] + a[i]);
            dp[i + 1][1] = min(dp[i + 1][1], dp[i][2] + a[i]);
            dp[i + 1][2] = min(dp[i + 1][2], dp[i][1] + c + b[i]);
            dp[i + 1][2] = min(dp[i + 1][2], dp[i][2] + b[i]);
        }
        for (int i = 1; i <= n; i ++ ){
            if (i != n)
                cout << min(dp[i][1], dp[i][2]) << " ";
            else
                cout << min(dp[i][1], dp[i][2]) << "
    ";
        }
        return 0;
    }
    /*
    0 2
    7 8
    13 17
    31 18
    24 28
    40 35
    53 36
    37 46
    54 40
    57 45
    */
    /*
    0 1
    3 2
    4 4
    7 7
    8 11
    11 13
    14 13
    14 15
    18 16
    17 19
    */
    
  • 相关阅读:
    ubuntu下安装flash
    PHPMailer邮件发送
    PHP制作简单分页(从数据库读取记录)
    windows下安装PHP环境
    捕获浏览器关闭,刷新事件
    ubuntu下安装wps
    用PHP制作一个简单的验证码
    一个PHP程序员应该掌握的10项技能!
    爬虫框架之scrapy
    Android杂谈禁止TimePicker控件通过keyboard输入
  • 原文地址:https://www.cnblogs.com/Misuchii/p/11734343.html
Copyright © 2020-2023  润新知