加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

折半搜索(超大背包)

发布时间:2020-12-16 09:19:48 所属栏目:百科 来源:网络整理
导读:https://ac.nowcoder.com/acm/contest/889/D #includebits/stdc++.h using namespace std; // __ #define pb push_back typedef long long ll;typedef unsigned long long ull; struct node{ int num; ull sum;}a[ 1 19 ],b[ 1 19 ]; bool cmp(node p,node q

https://ac.nowcoder.com/acm/contest/889/D

#include<bits/stdc++.h>
using namespace std;
//__
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
struct node{
    int num;
    ull sum;
}a[1<<19],b[1<<19];
bool cmp(node p,node q){
    return p.sum<q.sum;
}

int main(){
    int n;
    ull s;
    scanf("%d%llu",&n,&s);
    int lena=1,lenb=1;
    int p=n/2;
    for(int i=0;i<p;i++){
        ull x;
        scanf("%llu",&x);
        int m=lena;
        for(int j=0;j<m;j++){
            a[lena].num=(a[j].num|(1<<i));
            a[lena].sum=a[j].sum+x;
            lena++;
        }
    }
    for(int i=p;i<n;i++){
        ull x;
        scanf("%llu",&x);
        int m=lenb;
        for(int j=0;j<m;j++){
            b[lenb].num=(b[j].num|(1<<i));
            b[lenb].sum=b[j].sum+x;
            lenb++;
        }
    }
    sort(a,a+lena,cmp);
    sort(b,b+lenb,cmp);
    int l=0,r=lenb-1;
    while(l<lena){
        while(a[l].sum+b[r].sum>s&&r)
            r--;
        if(a[l].sum+b[r].sum==s)
            break;
        l++;
    }
    for(int i=0;i<(int)n/2;i++)
        printf("%d",(a[l].num>>i)&1);
    for(int i=int(n/2);i<n;i++)
        printf("%d",(b[r].num>>i)&1);
    return 0;
}
View Code

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读