zoukankan      html  css  js  c++  java
  • 2020-05-27 — 习题训练三题解

    https://vjudge.net/contest/375686#overview

    A - Sorted Adjacent Differences

    从小到大排序,最后一个减最前面一个的差最大,并且倒数第二个减去第一个比刚刚的差值小,循环着输出就行了

    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int N = 1e5 + 10;
    int t, n, a[N], b[N];
    int main()
    {
        cin >> t;
        while(t--){
            cin >> n;
            for(int i = 1;i <= n; ++ i) cin >> a[i];
            sort(a + 1, a + 1 + n);
            int s = 1, e = n, k = n;
            while(s <= e)
            {
                b[k--] = a[e--];
                b[k--] = a[s++];
            }
            for(int i = 1;i <= n; ++ i) cout << b[i] << " ";
            cout << endl;
        }
    
    }

     B - Powered Addition

    记录最大与最小的差值,位运算数位数即可

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    
    template <typename T>
    
    inline void read(T &ret) {
        char c;
        int sgn;
        if (c = getchar(), c == EOF) return ;
        while (c != '-' && (c < '0' || c > '9')) c = getchar();
        sgn = (c == '-') ? -1:1;
        ret = (c == '-') ? 0:(c - '0');
        while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
        ret *= sgn;
        return ;
    }
    template <class T>
    inline void out(T x) {
        if (x > 9) out(x / 10);
        putchar(x % 10 + '0');
    }
    int t;
    void solve(){
            
        int n, res = 0;
        read(n);
        vector<ll> a(n);
        
        for(int i = 0;i < n; ++ i) read(a[i]);
        
        ll l= a[0], m = 0;
        
        for(int i = 0;i < n; ++ i){
            l = max(a[i], l);
            m = max(l - a[i], m);
        }
        while(m) m >>= 1, res ++;
        
        out(res);
        puts("");
    }
    int main()
    {
        ios_base::sync_with_stdio(false);
        read(t);
        while(t--) solve();
    }

    C - Middle Class

     从大到小排序, 依次取平均,有一个小于目标就失败了

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    
    void solve()
    {
        int n, x;
        cin >> n >> x;
        
        vector<int> v(n);
        for(int i = 0;i < n; ++ i) cin >> v[i];
        sort(v.begin(),v.end(), greater<int>());
        
        ll sum = 0;
        for(int i = 0;i < n; ++ i){
            sum += v[i];
            if(sum / (i + 1) < x){
                cout << i << "
    ";
                return ;
            }
        }
        cout << n << "
    ";
    }
    int main()
    {
        ios_base::sync_with_stdio(false);
        int t;
        cin >> t;
        while(t--) solve();
    }

    D - Circle of Monsters

     记录被b[i[伤害后的血量,求个和(sum)。需要有一个对着满血的怪开枪,sum = (求和)a[i] - b[i-1] (a[i] 前面那个), 所以应该加上最小的b[i-1](a[i] 前面那个), 也就是min{a[i] - c[i}], c[i] = a[i] - b[i-1](a[i] 前面那个);

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    
    template <typename T>
    
    inline void read(T &ret) {
        char c;
        int sgn;
        if (c = getchar(), c == EOF) return ;
        while (c != '-' && (c < '0' || c > '9')) c = getchar();
        sgn = (c == '-') ? -1:1;
        ret = (c == '-') ? 0:(c - '0');
        while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
        ret *= sgn;
        return ;
    }
    void solve(){
        int n;
        read(n);
        vector<ll> a(n), b(n), c(n);
        for(int i = 0;i < n; ++ i){
            read(a[i]), read(b[i]);
        }
        
        c[0] = max(0ll, a[0] - b[n-1]);
        ll sum = c[0], k = a[0] - c[0];
        
        for(int i = 1;i < n; ++ i){
            c[i] = max(0ll, a[i] - b[i-1]);
            sum += c[i];
            k = min(k, a[i] - c[i]);
        }
        
        printf("%lld
    ",sum+k);
    }
    int main()
    {
        ios_base::sync_with_stdio(false);
        int t;
        read(t);
        while(t--) solve();
    }

    E - Kind Anton

    a[i]前面有1可以解决b[i] > a[i], 有-1可以解决b[i] < a[i]; 

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    
    template <typename T>
    
    inline void read(T &ret) {
        char c;
        int sgn;
        if (c = getchar(), c == EOF) return ;
        while (c != '-' && (c < '0' || c > '9')) c = getchar();
        sgn = (c == '-') ? -1:1;
        ret = (c == '-') ? 0:(c - '0');
        while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
        ret *= sgn;
        return ;
    }
    template <class T>
    inline void out(T x) {
        if (x > 9) out(x / 10);
        putchar(x % 10 + '0');
    }
    void solve(){
            
        int n;
        read(n);    
        vector<int> a(n), b(n);
        for(int i = 0;i < n; ++ i) read(a[i]);
        for(int i = 0;i < n; ++ i) read(b[i]);
        
        int cnt1 = 0, neg_cnt1 = 0;
        if(a[0] != b[0]){
            puts("NO");
            return ;
        }
        if(a[0] == 1) cnt1 ++;
        if(a[0] == -1) neg_cnt1 ++;
        
        for(int i = 1;i < n; ++ i){
            if(cnt1 && neg_cnt1){
                puts("YES");
                return ;
            }
            if(b[i] > a[i] && cnt1 == 0){
                puts("NO");
                return ;
            } 
            if(b[i] < a[i] && neg_cnt1 == 0){
                puts("NO");
                return ;
            }
            
            if(a[i] == 1) cnt1 ++;
            if(a[i] == -1) neg_cnt1 ++;
            
        }
        puts("YES");
    }
    int main()
    {
        ios_base::sync_with_stdio(false);
        int t;
        read(t);
        while(t--) solve();
    }
  • 相关阅读:
    [原创]网页级在线性能测试网站介绍
    [原创]浅谈测试团队文化
    [原创]浅谈自动化测试中的金字塔模型理解
    [原创]如何在面试时选择合适的测试人员?
    [原创]浅谈怎么写周报
    [原创]Windows下调试工具介绍
    [原创]浅谈我对持续集成的理解
    [原创]IBM AppScan工具培训
    [原创]Jenkins持续集成工具介绍
    [原创]什么是信息安全资产管理?
  • 原文地址:https://www.cnblogs.com/DefineWaAc/p/12986979.html
Copyright © 2011-2022 走看看