Codeforces Round #577 (Div. 2) B Zero Array

题目链接

题目大意:

给定一个数字 n ,接下来是 n 个数字,每次操作可以使得任意两个数字都减一,问能否使整个数列变成0

思路:

求整个数列的和,以及最大值,将最大值与和的一半作比较,如果和的一半小于最大值则输出no,当然,如果n是奇数也是no

原因:

我们显而易见的是奇数的时候可以直接输出no,因为无论如何最后肯定会有剩余数字,其次如果最大值大于和的一半,那么就用除了最大值以外的所有值没办法去消除最大值,所以no,如果最大值等于和的一半,恰好可以用最大值和其余的全部值抵消,如果最大值小于和的一半,既然和是偶数,也就是说最大值和其余的差一定是偶数,那么经过多次操作之后,每次操作会让两个数都减去1,就相当于每次操作都会减少2,那么若干次操作后会出现最大值和当前所有剩余的值的和相等的情况,所以yes

#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
typedef long long ll;
 
int main()
{
    ios_base::sync_with_stdio(0);
 
    int N;
    ll ctot = 0, chi = 0;
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        ll x; cin >> x;
        ctot += x;
        chi = max (chi, x);
    }
 
    if (ctot % 2 == 0 && chi * 2 <= ctot)
        cout << "YES\n";
    else
        cout << "NO\n";
    return 0;
}

 

posted @ 2019-08-05 03:25  correct  阅读(62)  评论(0)    收藏  举报