首页 > 其他 > 详细

[题解](折半搜索)luogu_P4799世界冰球锦标赛

时间:2019-05-13 22:18:42      阅读:144      评论:0      收藏:0      [点我收藏+]

抄的题解

2^40爆搜过不了,考虑折半搜索,难点在于合并左右的答案,因为有可能答案同时载左右两边,我们用两个数组记录下来答案,

然后我们再对左边的答案排个序,那么对于右边其中的技术分享图片来说,它可能产生的集合是与左边技术分享图片的状态相结合。使用二分查找

输入要用%lld

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int n,mid;
ll m,w[50],suma[1<<21],sumb[1<<21],cnta,cntb,ans;
void dfs(int l,int r,ll sum,ll a[],ll &cnt){
    if(sum>m)return;
    if(l>r){
        a[++cnt]=sum;return;
    }
    dfs(l+1,r,sum+w[l],a,cnt);
    dfs(l+1,r,sum,a,cnt);
}
int main(){
    scanf("%d%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",&w[i]);
    mid=n/2;
    dfs(1,mid,0,suma,cnta);
    dfs(mid+1,n,0,sumb,cntb);
    sort(suma+1,suma+1+cnta);
    for(int i=1;i<=cntb;i++)
    ans+=upper_bound(suma+1,suma+1+cnta,m-sumb[i])-suma-1;
    printf("%lld\n",ans);
}

 

[题解](折半搜索)luogu_P4799世界冰球锦标赛

原文:https://www.cnblogs.com/superminivan/p/10859329.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!