关于此题排序疑惑
查看原帖
关于此题排序疑惑
774009
lbh666楼主2024/8/13 22:13

rt,写的折半搜索,把排序顺序调换一下就 AC 了,

TLE 88 pts:

#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=l;i<=r;++i)
using namespace std;

const int N=35;
int n,m,ans=1145141919810;
int a[N];
unordered_map<int,int> b;

bool cmp(int x,int y){
    return x>y;
}

void dfs(int now,int k,int sum,int step,bool op){
    if(sum>m || step>ans)return ;
    if(sum==m){
        ans=min(ans,step);
        return ;
    }
    if(now==k+1){
        if(op==0){
            if(b.count(sum))b[sum]=b[sum]<step?b[sum]:step;
            else b[sum]=step;
        }else{
            if(b.count(m-sum))ans=min(ans,b[m-sum]+step);
        }
        return ;
    }
    dfs(now+1,k,sum,step,op);
    dfs(now+1,k,sum+a[now],step,op);
    dfs(now+1,k,sum+a[now]/2,step+1,op);
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>n>>m;
    m<<=1;
    rep(i,1,n){
        cin>>a[i];
        a[i]<<=1;
    }
    sort(a+1,a+n+1,cmp);
    dfs(1,n/2,0,0,0);
    dfs(n/2+1,n,0,0,1);
    if(ans==1145141919810)cout<<"-1\n";
    else cout<<ans<<endl;
	return 0;
}

AC:只需要将 sort 那一行改为 sort(a+1,a+n+1); 就过了。

题解区似乎没有明确说明,求各位大佬解惑。

2024/8/13 22:13
加载中...