牛客多校第九场 D

图片说明
图片说明

  • 题意:
  • 给你n个数,和一个数s
  • 问你用哪几个数相加可以构成s,如果存在,只有唯一解,如果不存在输出-1
  • 题解:
  • 折半搜索,额,第一次见
  • 赶紧记下来吧,模板
  • 代码:
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    set<ll> s;
    map<ll,int> mp;
    ll a[40],sum;
    int n;
    int main()
    {
      cin>>n;
      int p=n/2;
      int q=n-p;
      cin>>sum;
      for(int i=0;i<n;i++)
          cin>>a[i];
      for(int i=0;i<(1<<p);i++)
      {
          ll cnt = 0;
          for(int j=0;j<p;j++)
              if(i&(1<<j))
                  cnt += a[j];
          s.insert(cnt);
          mp[cnt] = i;
      }
      for(int i=0;i<(1<<q);i++)
      {
          ll cnt = 0;
          for(int j=0;j<q;j++)
              if(i&(1<<j))
                  cnt += a[j+p];
          if(s.find(sum - cnt) != s.end()){
              int x = mp[sum-cnt];
              for(int j=0;j<p;j++)
                  printf("%d",(bool)(x&(1<<j)));
              for(int j=0;j<q;j++)
                  printf("%d",(bool)(i&(1<<j)));
              cout<<endl;
              return 0;
          }
      }
      return 0;
    }
    

```

全部评论

相关推荐

08-30 15:51
已编辑
蚌埠坦克学院 Java
狸猫换offer:感觉hr写这段字的时候充满怨气
lastday知无不言
点赞 评论 收藏
分享
双尔:项目太多太杂没有重点,4个项目不如精简到两个,实习工作描述太宽泛了,要具体到做了什么
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务