【小码匠自习室】小学的数学,助力连刷3道位运算

2023-03-06 14:36:27 浏览数 (1)

【小码匠自习室】小学的数学,助力连刷3道位运算

昨天刷一道二分题时涉及位运算,趁热打铁,老码农让我把位运算这块基础知识加强下。

自然是先刷了几道难度【普及】的题目先练练手,找找感觉。

这几道题难题都不大, 都很顺利切掉。

知识点:涉及小学数学的进制转换,因式分解,奇偶性判断,染色原理。

题目:P4136 谁能赢呢?

  • 思路:这道题是一道比较基础黑白方格染色原理
  • 地址:https://www.luogu.com.cn/problem/P4136
  • 题目

题目描述

小明和小红经常玩一个博弈游戏。给定一个n×n的棋盘,一个石头被放在棋盘的左上角。他们轮流移动石头。每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。

假如小明先移动石头,而且两个选手都以最优策略走步,问最后谁能赢?

输入格式

  • 输入文件有多组数据。
  • 输入第一行包含一个整数n,表示棋盘的规模。
  • 当输入n为0时,表示输入结束。

输出格式

对于每组数据,如果小明最后能赢,则输出Alice, 否则输出Bob, 每一组答案独占一行。

输入输出样例

  • 输入
代码语言:javascript复制
2
0
  • 输出
代码语言:javascript复制
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;
}

0 人点赞