关于暴力碾标算(请求加强数据)
查看原帖
关于暴力碾标算(请求加强数据)
608775
Rorre_y楼主2024/11/11 19:54

rt,本题正解为折半搜索,然而本蒟蒻爆搜+剪枝代码甚至碾压大部分标算(合计130ms),并且秒过讨论区某hack

#include<bits/stdc++.h>
using namespace std;
long long w[105],num[105];
int minn=114514,n,m;
inline bool cmp(int x,int y){
	return x>y;
}
inline void dfs(int x,long long ans,int cnt){
	if(x==n+1){
		if(ans!=m){
			return;
		}
		minn=min(minn,cnt);
		return;
	}
	if(ans+num[x]<m){//前缀和优化剪枝+可行性剪枝
		return;
	}
	if(ans+num[x]==m){//前缀和优化剪枝
		minn=min(minn,cnt);
		return;
	}
	if(ans+w[x]<=m){//可行性剪枝
		dfs(x+1,ans+w[x],cnt);
	}
	if(ans+w[x]/2<=m){
		dfs(x+1,ans+w[x]/2,cnt+1);
	}
	dfs(x+1,ans,cnt);
}
int main()
{
	scanf("%d %d",&n,&m);
	m*=2;
	for(int i=1;i<=n;i++){
		scanf("%d",&w[i]);
		w[i]*=2;
	}
	sort(w+1,w+n+1,cmp);//排序(贪心)
	for(int i=n;i>=1;i--){
		num[i]=num[i+1]+w[i];
	}
	dfs(1,0,0);
	if(minn!=114514){
		printf("%d",minn);
	}
	else{
		printf("-1");
	}
}

因此,请求加强数据。

2024/11/11 19:54
加载中...