首页 > 其他分享 >CF1552D题解

CF1552D题解

时间:2023-11-18 19:23:57浏览次数:27  
标签:int 题解 CF1552D solve dp op

CF1552D题解

思路

首先,$a_i$ 的正负不重要,如果 $a_i=b_j-b_k$,那么就有 $-a_i=b_k-b_j$,读入时将 $a_i$ 全部转化为正数。

若满足 $a_i+a_j+\ldots+a_k$,那么就可以构造出 $b$ 序列,否则不行。

从左到右遍历一遍 $a$ 序列,动态规划推出所有可以组成的和,并判断是否满足上式,时间复杂度 $O(T\times n\times \max(a_i))$。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int T,n,dp[N],a[20];

void solve(){
	for(int i=0;i<N;i++) dp[i]=0;
	cin>>n; dp[0]=1; bool flag=false;
	for(int i=0;i<n;i++){ cin>>a[i]; a[i]=a[i]<0?-a[i]:a[i]; }
	for(int i=0;i<n;i++)
		for(int j=N-1-a[i];j>=0;j--)
			if(dp[j]){
				if(dp[j+a[i]]==1) flag=true;
				else dp[j+a[i]]=1;
			}
	cout<<(flag?"YES\n":"NO\n");
}
-
signed main(){
	ios::sync_with_stdio(false);
	for(cin>>T;T;T--) solve();
}

现在抛出一个不难验证的结论:若 $a_i;\mathcal{op};a_j;\mathcal{op}\ldots;a_k;\mathcal{op} ;a_l=0$ ($op$ 为 $+$ 或 $-$ )
那么就可以构造出序列 $b$,否则不能。
那么对于 $a$ 序列中的所有数,有三种情况:

  1. $a_i$ 不在上面式子中。
  2. $a_i$ 在上式中,$op$为 $+$。
  3. $a_i$ 在上式中,$op$ 为 $-$。

共 $3^n-1$ 种状态(因为不能全部不在上式中,所以减去 $1$ 种情况)。

遍历 $1$ 次这种状态,若有一种情况符合上式,那么就输出 yes,时间复杂度 $O(n\times3^n)$。

#include<bits/stdc++.h>
using namespace std;
int T,n,a[20];

void solve(){
	cin>>n; int k=pow(3,n);
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=1;i<k;i++){
		int sum=0,tk=i;
		for(int j=0;j<n;j++){
			int s=tk%3; tk/=3;
			if(s==2) s=-1;
			sum+=s*a[j];
		}
		if(sum==0) return (void)(cout<<"YES\n");
	}
	cout<<"NO\n";
}

signed main(){
	ios::sync_with_stdio(false);
	for(cin>>T;T;T--) solve();
}

标签:int,题解,CF1552D,solve,dp,op
From: https://www.cnblogs.com/IOIAKmerlin/p/17832517.html

相关文章

  • CF985C 题解
    CF985C题解思路由题意得知,现在有$n\timesk$块木板需要组装成$n$个木桶,每个木桶由$k$块板组成,容量服从短板原理,要求容量差不得超过$I$,求最大容量和。不管采用什么方法,无疑我们首先需要将板长(数组$a$)从小到大排列。利用贪心算法。先找出与$a_0$的长度差不超过$l$的......
  • UVA10652 Board Wrapping 题解
    LinkUVA10652BoardWrappingQuestion给出\(N\)个矩形,求面积最小的凸多边形能包住所有矩形求矩形面积占凸多边形面积的百分比Solution把矩形的四个顶点拿出来,就可以转化成凸包裸题了Code#include<bits/stdc++.h>usingnamespacestd;constdoubleeps=1e-9;constd......
  • NEFU OJ Problem1487 时空乱流题解
    时空乱流Problem:ETimeLimit:1500msMemoryLimit:65535KDescription星际飞行员Alice在一次航行中遭遇了时空乱流,时空乱流将导致Alice乘坐的飞船在n个位面之间穿梭。星际宇航局管理员Bob收到了Alice的求救信号,决定在某些位面上设立监测站,当Alice进入某个已经设立监......
  • 关于maven构建tomcat服务器一直启动不了的问题解决
    以往我都是创建maven项目后自己去配置web,再通过自己配置以下信息之后,配置tomcat。最终结果是始终报错 之后摸索发现,可以在maven项目配置前将以上“maven主路径,用户设置文件,本地仓库”信息确定好。 在弹出的页面设置好后,再创建maven项目便省时很多,tomcat配置后可以使用 ......
  • 【HDU 1276】士兵队列训练问题 题解(链表+模拟)
    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至......
  • T399753 counting problem(计数问题)题解
    LinkT399753countingproblem(计数问题)Question给出一个正整数\(n\),求\(AB+CD=n\)的方案数,\(A,B,C,D\)都是要求是正整数Solution考虑直接枚举\(ABCD\)显然是不切实际的那么就折半枚举设\(F_i\)表示两个数的乘积为\(i\)的方案数答案就是\(\sum\limits_{i=1......
  • T399750 Cell kingdom(Hard) 题解
    LinkT399750Cellkingdom(Hard)Qustion第一天产生\(1\)个细胞,之后的每一天,一个细胞都会分裂成\(8\)个和自己一样的细胞,每个细胞在第三天都会自爆并且带走当天产生的\(6\)个细胞,求第\(x\)天有多少细胞Solution我们设\(F[i]\)表示第\(i\)天产生的新细胞个数那么可......
  • T399742 Ting'er loves traveling 题解
    LinkT399742Ting'erlovestravelingQuestion给出一个图,使得\(1\)到\(N\)的路径上的最大值最小Solution看到最大值最小想到二分,二分最大值\(top\)然后去check验证能不能从\(1\)走到\(N\)Code#include<bits/stdc++.h>#defineintlonglongusingnamespacest......
  • 前端页面部署之后刷新页面之后出现HTTP 错误 404.0 - Not Found错误问题解决
    前端页面部署能正常访问,但是一旦刷新页面就报如下错误:404.0-NotFound 解决办法:下载IISURL重写模版,并安装。下面为安装地址:URLRewrite:TheOfficialMicrosoftIISSite安装之后IIS中出现如下IIS重写模块:点击进去添加规则,添加空白规则:  配置好之后会自动生成we......
  • T399751 Liangle's Rose Problem(亮亮的玫瑰问题)题解
    LinkT399751Liangle'sRoseProblem(亮亮的玫瑰问题)Question给出一个数组\(a\),有\(Q\)次询问,每次询问\([L,R]\)种随便挑选几个连续的\(a_i\)使得,他们几个的或的值最大Solution考虑贪心,如果把负数视为\(0\),那么一个数或上另外一个数,数肯定是变大的,那么就应该或上\(......