bitset压缩

Music Problme

https://ac.nowcoder.com/acm/problem/13885

bitset可以用于那些选举个别元素进行组合进行求和,积等问题,以求和为例如下题所示,我们可以用bitset去求出素组中元素的所有组合的和存放在bitste里面,求得的值是多少,我们就让这个位置的上的值设为1,比如有3个数1,2,3,任意两个数的和有3,4,5,假设有定义bitset<7500>p,那么p[3] = 1,p[4] = 1,p[5] = 1,三个数也是类似,然后又可以发现我们可以用移位来完成这个加法操作,比如有1,p[1] = 1,那么2的话可以是1左移了两位,3是左移了三位,然后这里我们可以使用或操作来完成,每次我们将这个数与它左移n位后的数进行或操作,比如现在是0010,加上2,左移两位1000,或操作后得到1010,这样一来1和3都被选到了,相当于这前有的数依然保持在那,加上后的数的位置置为1。


这道题可以用bitset来优化,只要选出3600的倍数即可。

#include <bits/stdc++.h>
#include <iostream>
const int Max = 100 * 100 * 100 + 5;
#define LL long long
const int mod = 1e9+7;
//const int inx = INT_MAX; 
using namespace std;
//    srand(time(NULL));
//        m = rand() % 1000 + 1;

//定义i i(A) i+n i+n(B) i+n+n i+n+n(C) 
//bitset<Max>s,q;

int a[100005];
int main()
{
    int T,n,i;
    cin >> T;
    while(T--){
        bitset<7500>p;
        cin >> n;
        for(i = 1; i <= n; i++){
            cin >> a[i];
            a[i] %= 3600;
        }
        for(i = 1; i <= n; i++){
            p |= (p << a[i]) | ((p << a[i]) >> 3600);
            p[a[i]] = 1;
        }
        if(p[0]) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}
全部评论

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务