[Codeforces] Codeforces Global Round 11 A. Avoiding Zero

2020年12月12日

問題

方針

配列 \( a \) の総和が \( 0 \) のときは条件を満たす \( b \) は存在しません。配列 \( a \) の総和を \( s \) とすると、\( s > 0 \) のとき、\( a \) を降順に並べることで、任意の累積和が \( 0 \) より大きくなります。一方で、\( s < 0 \) のときは、昇順に並べることで、任意の累積和が \( 0 \) より小さくなります。

コード

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n;
int a[50];

void solve(int sum) {
    sort(a, a + n);
    if (sum > 0) {
        for (int i = n - 1; i >= 0; i--) {
            if (i == 0) {
                cout << a[i] << "\n";
            } else {
                cout << a[i] << " ";
            }
        }
    } else {
        for (int i = 0; i < n; i++) {
            if (i == n - 1) {
                cout << a[i] << "\n";
            } else {
                cout << a[i] << " ";
            }
        }
    }
    
}

int main() {
    int t;
    cin >> t;
    for (int i = 0; i < t; i++) {
        cin >> n;
        int sum = 0;
        for (int j = 0; j < n; j++) {
           cin >> a[j];
           sum += a[j];
        }
        if (sum == 0) {
            cout << "NO\n";
        } else {
            cout << "YES\n";
            solve(sum);
        }
    }
    return 0;
}

感想

言われてみればそうかと思うんですが、思いつきませんでした。