蓝桥杯打卡-Day1

酶和ATP 2022年03月08日 810次浏览

国赛2021-纯质数

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。

前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · ·。

如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如2,3,5,7,23,37 都是纯质数,而 11, 13, 17, 19, 29, 31不是纯质数。当然 1, 4, 35也不是纯质数。

请问,在 11 到 20210605中,有多少个纯质数?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

这是一个填空题,直接输出答案 1903 就行,直接暴力解决。下面是计算的代码。

#include <iostream>
using namespace std;

const int N = 20210605;

bool prime[N + 10];

bool isprime(int x) {
    if (x < 2) return false;
    for (int i = 2; i * i <= x; i++)
        if (x % i == 0) return false;

    return true;
}

bool ischun(int n) {
    while (n) {
        int t = n % 10;
        if (t == 1 || t == 4 || t == 6 || t == 8 || t == 9 || t == 0)
            return false;
        n /= 10;
    }
    return true;
}

int main() {
    int res = 0;
    for (int i = 2; i < N; i++) {
        if (isprime(i) && ischun(i)) {
            res++;
        }
    }
    cout << res << endl;
    return 0;
}

2021省赛-最小筹码

问题描述

你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 N 的正整数重量。
那么这套砝码最少需要包含多少个砝码?
注意砝码可以放在天平两边。

输入格式

输入包含一个正整数 N。

输出格式

输出一个整数代表答案。

样例输入

7

样例输出

3

样例说明

3 个砝码重量是 1、4、6,可以称出 1 至 7 的所有重量。

1 = 1;

2 = 6 − 4(天平一边放 6 ,另一边放 4 );

3 = 4 − 1;

4 = 4;

5 = 6 − 1;

6 = 6;

7 = 1 + 6;

少于 3 个砝码不可能称出 1 至 7 的所有重量。

评测用例规模与约定

对于所有评测用例,1 ≤ N ≤ 1000000000。

似乎是比较简单的贪心,为啥我是看了题解才勉强会写呢...

贪心思路:

#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;

typedef long long LL;

LL cnt;
LL sum;
LL res;

int main() {
    LL n;
    cin >> n;
    for (int i = 0; i < 0x3f3f3f; i++) {
        sum += pow(3, i);
        if (sum >= n) {
            res = i;
            break;
        }
    }

    cout << res + 1 << endl;
    return 0;
}

2021模拟赛-灌溉

题目描述

小蓝负责花园的灌溉工作。

花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。

小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。

每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。

给定花园水管的位置,请问 k 分钟后,有多少个方格被灌溉好?

输入描述

输入的第一行包含两个整数 n, m。

第二行包含一个整数 t ,表示出水管的数量。

接下来 t 行描述出水管的位置,其中第 i 行包含两个数 r, c 表示第 r 行第 c 列有一个排水管。

接下来一行包含一个整数 k。

其中,1 \leq n, m \leq 100, 1 \leq t \leq 10, 1 \leq k \leq 1001≤n,m≤100,1≤t≤10,1≤k≤100。

输出描述

输出一个整数,表示答案。

输入输出样例

示例 1

输入

3 6
2
2 2
3 4
1

输出

9

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define x first
#define y second
using namespace std;

const int N = 110;
// 偏移量
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
// 队列
typedef pair<int, int> PII;
queue<PII> q;
bool watered[N][N];

int n, m, t, k;

int cnt;
void water() {
    // 第一个元素
    auto sign = q.front();
    q.push(q.front());
    do {
        auto t = q.front();
        for (int i = 0; i < 4; i++) {
            int x = t.x + dx[i];
            int y = t.y + dy[i];
            // 如果越界
            if (x < 0 || x > n || y < 0 || y > m) continue;
            // 如果已经灌溉过了
            if (watered[x][y]) continue;
            // 如果没有
            watered[x][y] = true;
            cnt++;
            q.push({x, y});
        }
        q.pop();
    } while (q.front() != sign);
}

int main() {
    scanf("%d%d%d", &n, &m, &t);
    while (t--) {
        int r, c;
        scanf("%d%d", &r, &c);
        watered[r][c] = true;
        q.push({r, c});
        cnt++;
    }
    scanf("%d", &k);
    // 每一个 k 就是一次灌溉的过程
    while (k--) {
        water();
    }
    printf("%d", cnt);
    return 0;
}