【小码匠自习室】小学的数学,助力连刷3道位运算
昨天刷一道二分题时涉及位运算,趁热打铁,老码农让我把位运算这块基础知识加强下。
自然是先刷了几道难度【普及】的题目先练练手,找找感觉。
这几道题难题都不大, 都很顺利切掉。
知识点:涉及小学数学的进制转换,因式分解,奇偶性判断,染色原理。
题目:P4136 谁能赢呢?
- 思路:这道题是一道比较基础黑白方格染色原理
- 地址:https://www.luogu.com.cn/problem/P4136
- 题目
题目描述
小明和小红经常玩一个博弈游戏。给定一个n×n的棋盘,一个石头被放在棋盘的左上角。他们轮流移动石头。每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。
假如小明先移动石头,而且两个选手都以最优策略走步,问最后谁能赢?
输入格式
- 输入文件有多组数据。
- 输入第一行包含一个整数n,表示棋盘的规模。
- 当输入n为0时,表示输入结束。
输出格式
对于每组数据,如果小明最后能赢,则输出Alice
, 否则输出Bob
, 每一组答案独占一行。
输入输出样例
- 输入
2
0
- 输出
Alice
说明/提示
对于20%的数据,保证1<=n<=10;
对于40%的数据,保证1<=n<=1000;
对于所有的数据,保证1<=n<=10000。
AC代码
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
#define endl 'n';
void best_coder() {
int n;
cin >> n;
while (n != 0) {
if (n & 1) {
cout << "Bob" << endl;
} else {
cout << "Alice" << endl;
}
cin >> n;
}
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
// 返回
return 0;
}
题目:P1348 Couple number
思路:关联知识:十进制转二进制
地址:https://www.luogu.com.cn/problem/P1348
AC代码
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
#define endl 'n';
void best_coder() {
int a, b;
cin >> a >> b;
int cnt = 0;
for (int i = a; i <= b; i) {
int c = abs(i);
if (c & 1 || c % 4 == 0) {
cnt;
}
}
cout << cnt;
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
// 返回
return 0;
}
题目:CF1688A Cirno's Perfect Bitmasks Classroom
思路:套用因式分解公式和奇偶性判断
重点:本题在洛谷上未知失败,然后cf上【**Happy New Year!**】,但题解需要在看看,还有些盲区知识点,今天本小码匠有些累了,要去看会剧本杀了。
- __builtin_popcount(x)
地址:https://www.luogu.com.cn/problem/CF1688A
AC代码
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
#define endl 'n';
int first_one (int x) {
int cnt = 0;
while (!(x & 1)) {
x >>= 1;
cnt;
}
return pow(2, cnt);
}
void best_coder() {
int n;
cin >> n;
for (int i = 0; i < n; i) {
int a;
cin >> a;
if (a == 1) {
cout << 3 << endl;
} else if (first_one(a) == a) {
cout << a 1 << endl;
} else {
cout << first_one(a) << endl;
}
}
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
// 返回
return 0;
}