C语言算法训练第十一天,如何为?
摘要:C++算法算法训练第十一天 以下为牛客挑战 今日收获 学到了状态压缩dp,这个是选或者不选两种情况所有数的情况。 for(int i=0;i<(1LL<&
C++算法算法训练第十一天
以下为牛客挑战
今日收获
学到了状态压缩dp,这个是选或者不选两种情况所有数的情况。
for(int i=0;i<(1LL<<n);i++){
}
__builtin__popcount(i);统计i中二进制的个数,可以用于判断有没有选到这么多。
if(i>>j&1)continue;这个是第被选了就下一个,这个是右移移动到最后一个看看是不是1
牛客练习赛148
签到题
A-签到题_牛客练习赛148 (nowcoder.com)
2
1 2
解题代码
#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cout<<i<<" ";
}
return 0;
}
Bob的蛋糕店
状态压缩 DP
B-Bob的蛋糕店_牛客练习赛148 (nowcoder.com)
2 1
1 1
No
这个题我不会一开始,但是我看了大佬的怎么解。
这个题用是数轴,我们可以假设给数轴的点全部搞成0,选了的搞成1;
这样的话一个位置就有两个可能,选或者不选,那一共有2的n次方的选择
也就是1LL<<n,1向右移动n个单位
1<<3
1000-->2的3次方。
所以我们可以去枚举所有的方法,比如枚举到i,---》这个也相当于一个状态。,相当于把1的选完了,剩下的枚举长度,
if(i>>j&1)continue;//遇到1的直接不要加上
这里一个很关键的函数
__builtin_popcount(i),统计i中y1的个数,是一个数二进制1的个数
我们可以用这个来判断到底选了多少。
