折半搜,爆0求调悬关
查看原帖
折半搜,爆0求调悬关
1604961
EternalFlame楼主2025/7/27 09:26
#include<bits/stdc++.h>
#define N 50
#define int long long
using namespace std;
int s[N],n,m,f[N],t,tot,mid,ans;
map <int,bool> p;
void dfs(int h,int l)
{
	for(int i = l + 1;i <= t;i ++)
	{
		if(s[i] + h <= m)
		{
			dfs(s[i] + h,i);
		}
	}
	if(!p[h])
	{
		p[h] = 1;
		f[++ tot] = h;
		ans = max(ans,h);
	}
	return;
}
void find(int a)//二分
{
	int l = 1,r = mid,mid_f;
	while(l <= r)
	{
		mid_f = (l + r) / 2;
		if(s[mid_f] + a > m) r = mid_f - 1;
		else
		{
			l = mid_f + 1;
			ans = max(ans,s[mid_f] + a);
		}
	}
	return;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin >> m >> n;
	t = n / 2 + 2;//前半限制
	for(int i = 1;i <= n;i ++) cin >> s[i];
	for(int i = 1;i <= t;i ++) dfs(s[i],i);
	t = n,mid = tot;//后半限制(还有个二分)
	sort(f + 1,f + 1 + tot);
	for(int i = n / 2 + 3;i <= n;i ++) dfs(s[i],i);
	for(int i = mid + 1;i <= tot;i ++) find(f[i]);
	cout << ans << endl;
	return 0;
}
2025/7/27 09:26
加载中...