CF1552D_Array Differentiation

1552D_Array Differentiation

思维:联想到图

/*
题意:给定序列 a 问能否构造出 b 使得 a 中每个数都可由 b 中数作差得到
将b数组看成点权,a数组看成边权,ai = bj - bk => j~k间有向边边权为ai,把作差理解成一条有向边
那么即得到一个 n 点 n 条边的图,若不考虑方向,这个图必然会有至少一个环
假设环上点为 b1 b2 b3 b4 ... bk => (b2 - b1) + (b3 - b2) + ... + (b1 - bk) = 0 
                               => t*a1 + t*a2 + ... + t*ak = 0 (t = 0/1/-1)
即暴力枚举是否存在a中的某些元素,+-随意组合结果为0即可
*/

// 实现上:t用三进制数表示每种情况,%3取当前位,/3右移

#include <bits/stdc++.h>

using namespace std;

void solve(){
    int sta = 1, n; cin >> n;
    
    std::vector<int>a(n);
    for(int i = 0; i < n; ++i) cin >> a[i], sta *= 3;
    
    for(int i = 1; i < sta; ++i) {
        int sum = 0, t = i;
        for(int j = 0; j < n; ++j) {
            if(t % 3 == 1) sum += a[j];
            else if(t % 3 == 2) sum -= a[j];
            t /= 3;
        }
        if(!sum) {
            cout << "YES" << endl;
            return;
        }
    }
    
    cout << "NO" << endl;
}

int main()
{
    int T; cin >> T
    
    while(T--) {
        solve();
    }

    return 0;
}
posted @   Ivessas  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示