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;
}
查看22道真题和解析