Codeforces Global Round 15 D. Array Differentiation(dfs)

在这里插入图片描述
题目大意:
对于给定的数组 a a a,请问是否存在一个与 a a a等长的数组使得 a i = b j − b k a_i=b_j-b_k ai=bjbk

思路:
一眼看到了数量级哈,只有10 !。天老爷哟~。
接下来我们来进行简单的分析,首先对于 a a a中的 n n n个数,假定有三个数
a 1 = b 1 − b 2 a_1=b_1-b_2 a1=b1b2 a 2 = b 2 − b 3 a_2=b_2-b_3 a2=b2b3 a 3 = b 3 − b 1 a_3=b_3-b_1 a3=b3b1
显然我们可以得到, a 1 + a 2 + a 3 = 0 a_1+a_2+a_3=0 a1+a2+a3=0
那么也就是说,我们将 b b b数组看做一个有 n n n个点首尾相连的环,起初将相邻两点连上一条有向边,由上述的分析可知,对于b形成的环,其边权之和一定为0,但是我们仅仅知道边权分别为a的每一个值,我们并不知道他是由 b i − b j b_i-b_j bibj得来还是由 b j − b i b_j-b_i bjbi得来,所以我们将b换做一个无向图,通过对边权值正负号的变化可以得出一组合理的解,使得b的权值和为 0 0 0

至此我们的结论分析完毕。

那么我们可以知道,对于每一个 a i a_i ai我们都有三种操作加他,减他,不管他。因此时间复杂度为 O ( N ∗ 3 1 0 ) O(N*3^10) O(N310)利用dfs爆搜即可

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<sstream>
#include<queue>
#define fr for
#define pi 3.1415926535
#define me(a,b,c) memset(a,b,sizeof c)
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e4 + 10;

map<int, int>mp;
int n;

int a[300];
bool dfs(int num, int sum, bool st) {
	if (num > n) {
		return sum == 0 && st;
	}
	return dfs(num + 1, sum - a[num], true) || dfs(num + 1, sum + a[num], true) || dfs(num + 1, sum, st);
}
int main() {
	int t;
	cin >> t;
	while (t--)
	{
		cin >> n;
		fr(int i = 1; i <= n; i++)cin >> a[i];
		if (dfs(1, 0, false)) {
			puts("YES");
		}
		else puts("NO");
	}
}

还有一种按位枚举的方法,是标程所给的。俺没有参透。。。但是确实学到了。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<sstream>
#include<queue>
#define fr for
#define pi 3.1415926535
#define me(a,b,c) memset(a,b,sizeof c)
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e4 + 10;


int T;
int n;
int a[N];

int main()
{
	cin >> T;
	while (T --)
	{
		cin >> n;

		int res = 1;
		for (int i = 1; i <= n; i ++) cin >> a[i], res *= 3;
		int flag = 0;
		for (int i = 1; i <= res - 1; i ++)
		{
			int t = i, sum = 0;

			for (int i = 1; i <= n; i ++)
			{
				if (t % 3 == 1) sum += a[i];
				if (t % 3 == 2) sum -= a[i];

				t /= 3;
			}
			if (!sum)
			{
				flag = 1;
				break;
			}
		}
		if (flag) puts("YES");
		else puts("NO");
	}
	

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Codeforces Round 511 (Div. 1)是一个比赛的名称。然而,引用内容中没有提供与这个比赛相关的具体信息或问题。因此,我无法回答关于Codeforces Round 511 (Div. 1)的问题。如果您有关于这个比赛的具体问题,请提供更多的信息,我将尽力回答。 #### 引用[.reference_title] - *1* [Codeforces Round 860 (Div. 2)题解](https://blog.csdn.net/qq_60653991/article/details/129802687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces Round 867 (Div. 3)(A题到E题)](https://blog.csdn.net/wdgkd/article/details/130370975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Codeforces Round 872 (Div. 2)(前三道](https://blog.csdn.net/qq_68286180/article/details/130570952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值