蒟蒻爆搜DFS居然又WA又T
查看原帖
蒟蒻爆搜DFS居然又WA又T
482730
aSunnyDay楼主2022/6/9 11:27

80分,第六个点WA,最后一个点T

#include<bits/stdc++.h>
#define N 1009
using namespace std;
typedef long long ll;
ll m,n,s[N],sum=0,a[N],b[N],l=0,r,ans=0,cnt=0;
bool vis[N];
bool dfs(ll x,ll sum,ll sum2,ll goal){
//	cout<<x<<" "<<sum<<" "<<sum2<<" "<<goal<<"\n";
	++cnt;
	if(cnt==18000000){
		cout<<ans,exit(0);
	}
	if(sum2==0) return 1;
	if(x==m+1) return 0;
	if(sum<sum2) return 0;//a:待切栅栏 b:应得栅栏
	bool ok=1;//sum:待切 sum2:被切 
	for(ll i=1;i<=goal;++i)
		if(!vis[i]&&a[x]>=b[i]){ok=0;break;}
	if(ok){
		if(dfs(x+1,sum-a[x],sum2,goal)) return 1;
		return 0;
	} 
	for(ll i=1;i<=goal;++i){
		if(vis[i]||a[x]<b[i]) continue;
		a[x]-=b[i],vis[i]=1;
//		cout<<i<<"\n";
		if(dfs(x,sum-b[i],sum2-b[i],goal)){
			a[x]+=b[i],vis[i]=0;
			return 1;
		}
		a[x]+=b[i],vis[i]=0;
	}
	return 0;
}
bool ok(ll mid){return dfs(1,sum,s[mid],mid);}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>m;
	for(ll i=1;i<=m;++i) cin>>a[i],sum+=a[i];
	cin>>n;
	for(ll i=1;i<=n;++i) cin>>b[i];
	r=n;
	sort(a+1,a+m+1);
	sort(b+1,b+n+1);
	for(ll i=1;i<=n;++i) s[i]=s[i-1]+b[i];
	while(l<=r){
		ll mid=(l+r)/2;
		if(ok(mid)) l=mid+1,ans=mid;
		else r=mid-1;
	}
	cout<<ans;
	return 0;
} 
2022/6/9 11:27
加载中...