Codeforces Round #618 (Div. 2) 小号上紫之路

这一场涨了不少,题也比较偏思维,正好适合我

A. Non-zero

我们记录这些数字的总和sum,并且记录0的个数zero,显然答案应该是这些0的个数,注意如果sum+zero==0的话答案要额外加一(因为总和不能是0)

    #include<bits/stdc++.h>
    #define LL long long
    #define maxn 100010
    #define x first
    #define y second
    using namespace std;
     
    typedef pair<int, int> pii;
     
    int a[maxn];
     
    int main(){
        int T;
        cin >> T;
        while(T--){
            int n, sum = 0;
            int z = 0;
            cin >> n;
            for(int i = 0; i < n; ++i){
                cin >> a[i];
                sum = sum + a[i];
                if(a[i] == 0){
                    z++;
                }
            }
            int ans = 0;
            if(sum == 0){
                ans = 1;
                sum++;
            }
            if(z != 0){
                ans = max(ans, z);
                if(sum == 1){
                    sum = sum + ans - 1;
                }
                else{
                    sum = sum + ans;
                }
            }
            if(sum == 0){
                ans++;
            }
            cout << ans << endl;
        }
        return 0;
    }

B. Assigning to Classes

要使得两组的中位数相差最小,很显然,如果把两组表示为G1和G2,那么如果G1的中位数更靠前,那么G2的中位数一定更靠后,那么易得当这俩中位数靠的最近的时候相差最小,此时G1跟G2的中位数应该在数组的中间,直接排序输出数组中间的差值便是答案

    #include<bits/stdc++.h>
    #define LL long long
    #define maxn 100010
    #define inf 0x3f3f3f3f
    #define x first
    #define y second
    using namespace std;
     
    typedef pair<int, int> pii;
     
    int a[maxn << 1];
     
    int main(){
        int T;
        cin >> T;
        while(T--){
            int n;
            cin >> n;
            for(int i = 0; i < 2 * n; ++i){
                cin >> a[i];
            }
            sort(a, a + 2 * n);
            int n1, n2;
            if(n % 2){
                cout << a[n] - a[n - 1] << endl;
            }
            else{
                cout << a[n] - a[n - 1] << endl;
            }
        }
        return 0;
    }

C. Anu Has a Function

我们考虑下这一组式子,对于f(a, b)=(a|b)-b函数的结果c的每一二进制位,如果这一位上b是1,那么容易知道c这一位一定是0,否则c这一位是看a这一位是否为1,很显然,c的二进制上为1的位一定是a这一位为1,b这一位为0的地方。所以推广到很多个b,就是a这一位为1,很多个b那一位全是0的时候,答案这一位才是0,取最大值就行了,我的处理方式还是比较简单的。

    #include<bits/stdc++.h>
    #define LL long long
    #define maxn 100010
    #define inf 0x3f3f3f3f
    #define x first
    #define y second
    using namespace std;
     
    typedef pair<int, int> pii;
     
    int a[maxn];
     
    int bit[50];
     
    void _in(int num){
        int now = 0;
        while(num){
            if(num & 1){
                bit[now]++;
            }
            num = num >> 1;
            now++;
        }
    }
     
    int _out(int num){
        int now = 0, ret = 0;
        while(num){
            if(num & 1 && bit[now] == 1){
                ret = ret + (1 << now);
            }
            num = num >> 1;
            now++;
        }
        return ret;
    }
     
    int main(){
        int n;
        cin >> n;
        memset(bit, 0, sizeof bit);
        for(int i = 0; i < n; ++i){
            cin >> a[i];
            _in(a[i]);
        }
        int ma = 0, no = -1;
        for(int i = 0; i < n; ++i){
            if(_out(a[i]) > ma){
                ma = _out(a[i]);
                no = i;
            }
        }
        if(no >= 0){
            cout << a[no] << " ";
        }
        for(int i = 0; i < n; ++i){
            if(i != no){
                cout << a[i] << " ";
            }
        }
        cout << endl;
        return 0;
    }

D. Aerodynamic

题意挺麻烦的,但是结论却很简单,必须是中心对称的偶数边数的多边形,我的处理方式居然没被hack,神奇

    #include<bits/stdc++.h>
    #define LL long long
    #define maxn 100010
    #define inf 0x3f3f3f3f
    #define x first
    #define y second
    using namespace std;
     
    typedef pair<double, double> pdd;
     
    pdd a[maxn];
     
    pdd b[maxn];
     
    int main(){
        int n;
        cin >> n;
        for(int i = 0; i < n; ++i){
            cin >> a[i].x >> a[i].y;
            if(i > 0){
                b[i].x = a[i].x - a[i - 1].x;
                b[i].y = a[i].y - a[i - 1].y;
            }
        }
        b[0].x = a[0].x - a[n - 1].x;
        b[0].y = a[0].y - a[n - 1].y;
        sort(b, b + n);
        if(n % 2){
            cout << "NO" << endl;
            return 0;
        }
        bool ans = true;
        for(int i = 0; i < n; ++i){
            if(b[i].x + b[n - i - 1].x != 0 || b[i].y + b[n - i - 1].y != 0){
                ans = false;
            }
        }
        cout << (ans ? "YES" : "NO") << endl;
        return 0;
    }

E. Water Balance

最后这个题听学长说是单调栈,还是比较简单明了的写法,但是我没写出来,可惜了

注意这个题取12位小数会WA,一定要取8位小数

这一场排到了576名,rating到了1700+,但是如果没有傻卵错误其实还可以再往前排一点,希望再打几场能上紫名 。

猜你喜欢

转载自www.cnblogs.com/Hebut-Amadeus/p/12322079.html