CF1552D Array Differentiation(思维)

题目传送门

思路

这个题啊,一看n=10,就知道肯定不用考虑时间复杂度了,应该是一个指数级别的时间复杂度。
其实就是我把这个考虑成一个数轴,我可以把 a i a_i ai当成一个两个点之间的距离(负数化成正数,因为距离都是正数)。
但是我需要明白的一点就是两个点之间的间隔一定是点数+1,因此我们需要找到这个数轴上的点可以成至少一个环。
因此,选择任意一个距离,他们之和如果能在我们新开的一个map上找到重合的部分,那么就说明我们可以找到这个数值,反之就说明我们不能找到这个数值。
因此可以用一个爆搜。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<int,int>mp;
int a[21021000];
int n;
void dfs(int u,int num){
    if(num>n){
        return;
    }
    mp[u+a[num]]++;
    dfs(u,num+1);
    dfs(u+a[num],num+1);
}
int main()
{
    int T;
    cin>>T;
    while(T--){
        
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]<0){
                a[i]=-a[i];
            }
        }
        if(n==1){
            if(a[1]==0){
                cout<<"YES"<<endl;
            }else cout<<"NO"<<endl;
            continue;
        }
        mp.clear();
        dfs(0,1);
        int ju=0;
        for(auto t:mp){
            if(t.second>=2)ju=1;//cout<<t.first<<endl;
        }
        if(ju==1)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }

}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值