2019牛客暑期多校训练营(第九场)D(折半搜索)

news/2024/5/19 1:21:19 标签: 折半搜索, 二进制, 枚举

题意:有n个数,给定一个数s,问从这n个数中取出若干个数,使他们的和等于s的方案(输入保证一定存在唯一的方案)

题解可参考博客:
https://www.icode9.com/content-4-392733.html
标程里写的是折半搜索,看了上面的博客,自己打了一遍,感觉更像是枚举+二分搜索(表示不懂折半搜索是啥)。

#include<cstdio>
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
map<ll,string> mp;
int n;
ll s,a[40];

int main()
{
	cin>>n>>s;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(ll i=0;i<(1<<(n/2));++i)		//二进制是个好东西
	{
		string t;
		ll temp=0;
		for(ll j=1;j<=n/2;++j)
		{
			if(i&(1<<(j-1)))
			{
				t+='1';
				temp+=a[j];
			}
			else t+='0';
		}
		mp[temp]=t;
	}
	bool flag=0;
	for(ll i=0;i<(1<<(n-n/2));++i)		//这里起点和终点要搞清楚,不是1<<(n/2)~1<<n
	{
		string t;
		ll temp=0;
		for(ll j=1;j<=n-n/2;++j)	//这里也是
		{
			if(i&(1<<(j-1)))
			{
				t+='1';
				temp+=a[n/2+j];
			}
			else t+='0';
		}
		if(mp.find(s-temp)!=mp.end())
		{
			cout<<mp[s-temp]+t<<endl;
			flag=1;
		}
		if(flag)	break;
	}
	return 0;
}

http://www.niftyadmin.cn/n/942966.html

相关文章

bzoj 2152: 聪聪可可

Description 聪聪和可可是兄弟俩&#xff0c;他们俩经常为了一些琐事打起来&#xff0c;例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑&#xff08;可是他们家只有一台电脑&#xff09;……遇到这种问题&#xff0c;一般情况下石头剪刀布就好了&#xff0c;可是…

洛谷P1006,传纸条(DP)

可以设置四维DP&#xff1a; dp[i,j,k,l]表示小渊走到( i, j )&#xff0c;小轩走到( k, l )时收获的最大好心值。 因为小渊和小轩都有两个方向走&#xff0c;所以dp[i,j,k,l]是从四种可能的状态转移过来的&#xff1a; dp[i,j,k,l]max(dp[i-1,j,k1,l],dp[i-1,j,k,l1],dp[i,j-1…

bzoj 3580: 冒泡排序

Description 下面是一段实现冒泡排序算法的C代码&#xff1a; for (int i1;i<n;i)   for (int j1;j<n-i;j)   if (a[j]>a[j1])   swap(a[j],a[j1]); 其中待排序的a数组是一个1~n的排列&#xff0c;swap函数将交换数组中对应位置的值。   对于给定的数组a以及给…

2019牛客暑期多校训练营(第十场)E(思维+递归)

题意&#xff1a;定义希尔伯特曲线在2k边长图的样子&#xff0c;给出n个点的坐标&#xff0c;求其根据曲线的顺序关系。 看题解做出来的&#xff0c;膜拜大佬。。。 先讲讲2k希尔伯特曲线是怎样画出来的&#xff1a; 1.将2k-1通过主对角线对称后&#xff0c;放置在2k左上角&am…

bzoj 3910: 火车

Description A 国有n 个城市&#xff0c;城市之间有一些双向道路相连&#xff0c;并且城市两两之间有唯一路径。现在有火车在城市 a&#xff0c;需要经过m 个城市。火车按照以下规则行驶&#xff1a;每次行驶到还没有经过的城市中在 m 个城市中最靠前的。现在小 A 想知道火车经…

2019牛客暑期多校训练营(第十场)D(扩展中国剩余定理+大整数防爆)

用中国剩余定理要求各个数直接互质&#xff0c;而扩展中国剩余定理则没有这个要求。 扩展中国剩余定理裸题&#xff0c;板子记好了。 因为数很大&#xff0c;过程可能会爆&#xff0c;所以可以用python&#xff0c;或者__int128. 代码如下&#xff1a; #include<iostream&g…

【codeforces】 ZeptoLab Code Rush 2015 A,B,C,D,E题解

D E统统FST... 差一点就飞升了... ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- A.King of Thieves 给你一张地图&#xff0c;让你从某个…

洛谷P1417 烹调方案(01背包+贪心)

题意&#xff1a;n个物品&#xff0c;T个时刻&#xff0c;每个物品只能制作一次,制作需要ci的时间&#xff0c;在t时刻完成第i样物品可以得到ai−t∗bi的价值&#xff0c;问在T的时间内最多能得到多少价值。 详解见博客&#xff1a;https://www.cnblogs.com/BCOI/p/8999396.ht…