P9234 80pts求调(悬一关)
  • 板块灌水区
  • 楼主hjhAKIOI
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/15 09:54
  • 上次更新2024/7/15 10:54:11
查看原帖
P9234 80pts求调(悬一关)
925818
hjhAKIOI楼主2024/7/15 09:54

WA on #4 #7,TLE on #19 #23 #24 QAQ

#include<iostream>
#include<unordered_map>
#include<algorithm>
#define int long long
using namespace std;
int n,m,tot,a[40],sum[40],ans=0x3f3f3f3f,t;

unordered_map<int,int> ma;

int read(){
    int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
	    if(c=='-'){
	    	f=-1;
		}   
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar(); 
	}
	return x*f; 
}

void dfs1(int idx,int now,int res){
	if(now>m||ans<res){
		return;
	}
	if(now==m){
		ans=min(ans,res);
		return;
	}
	if(idx>t){
	    if(now<=m){
	        if(!ma[now]){
    			ma[now]=res;
    		}
    		else ma[now]=min(ma[now],res);
	    }
		
		return;
	}
	dfs1(idx+1,now+a[idx],res+1);
	dfs1(idx+1,now+2*a[idx],res);
	dfs1(idx+1,now,res);
}

void dfs2(int idx,int now,int res){
	if(now>m||ans<res){
		return;
	}
	if(now==m){
		ans=min(ans,res);
		return;
	}
	if(idx>n){
		if(now<=m&&ma[m-now]){
			ans=min(ans,ma[m-now]+res);
		}
		return;
	}
	dfs2(idx+1,now+a[idx],res+1);
	dfs2(idx+1,now+2*a[idx],res);
	dfs2(idx+1,now,res); 
}

bool cmp(int a,int b){
	return a>b;
}

signed main(){
	n=read();
	m=read();
	m*=2;
	t=n/2;
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	sort(a+1,a+n+1,cmp);
	dfs1(1,0,0);
	dfs2(t+1,0,0);
	printf("%lld",ans==0x3f3f3f3f?-1:ans);
	return 0;
}
2024/7/15 09:54
加载中...