【牛客练习赛22 C】
https://www.nowcoder.com/acm/contest/132/C
题目大意:在n个区间中取出n个数,相加的和一共会出现多少种结果。
题目分析:对于这种挑选数字相加,由于每一步不同的选择都会影响结果,并且会出现重复的结果,所以很自然地想到使用bitset进行解决..
【基本操作:使用<<a给每个结果加上a,使用 | (1<<a) 添加一个结果】
【注意使用bitset不会爆位数..而使用(1<<a)的过程可能爆掉..在该题中就爆掉了..可以使用构建新的bitset先 << 再与 原 bitset进行 | 操作】
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 bitset<1000005>fo(0); 6 bitset<1000005>fo1(0); 7 bitset<1000005>fo2(0); 8 bitset<1000005>fo3(0); 9 int n; 10 scanf("%d",&n); 11 int tot=0; 12 for(int i = 0 ; i < n ; i++){ 13 int qwq1,qwq2; 14 scanf("%d%d",&qwq1,&qwq2); 15 fo2=fo1; 16 fo1=fo3; 17 for(int j = qwq1 ; j <= qwq2 ; j++){ 18 fo=fo2; 19 bitset<1000005>fo4(1); 20 if(i) 21 fo<<=(j*j); 22 else{ 23 fo4<<=(j*j); 24 fo|=fo4; 25 } 26 fo1|=fo; 27 28 } /*for(int k = 0 ; k <= 1000000 ; k++){ 29 if((fo1[k])&(1)){tot++;cout << k <<endl;}*/ 30 31 } 32 33 for(int i = 0 ; i <= 1000000 ; i++){ 34 if(fo1[i]&1){tot++;} 35 } 36 cout << tot << endl; 37 return 0; 38 }