蓝桥杯打卡-Day5

酶和ATP 2022年03月12日 697次浏览

猴子分香蕉-2018省赛

https://www.lanqiao.cn/problems/618/learning/

题目描述

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

5 只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。

第 1 只猴子醒来,把香蕉均分成 5 堆,还剩下 1 个,就吃掉并把自己的一份藏起来继续睡觉。

第 2 只猴子醒来,把香蕉均分成 5 堆,还剩下 2 个,就吃掉并把自己的一份藏起来继续睡觉。

第 3 只猴子醒来,把香蕉均分成 5 堆,还剩下 3 个,就吃掉并把自己的一份藏起来继续睡觉。

第 4 只猴子醒来,把香蕉均分成 5 堆,还剩下 4 个,就吃掉并把自己的一份藏起来继续睡觉。

第 5 猴子醒来,重新把香蕉均分成 5 堆,哈哈,正好不剩!

请计算一开始最少有多少个香蕉。

暴力解决,答案是3141

#include <iostream>
using namespace std;
int main() {
    // 假设开始有n个
    for (int i = 0; i < 1000000; i++) {
        int n = i;
        // 第一只
        if (n > 0 && n % 5 == 1)
            n = n - n / 5 - 1;
        else
            continue;
        // 第二只
        if (n > 0 && n % 5 == 2)
            n = n - n / 5 - 2;
        else
            continue;
        // 第三只
        if (n > 0 && n % 5 == 3)
            n = n - n / 5 - 3;
        else
            continue;
        // 第四只
        if (n > 0 && n % 5 == 4)
            n = n - n / 5 - 4;
        else
            continue;
        // 最后一只
        if (n > 0 && n % 5 == 0) {
            cout << i << endl;
            break;
        }
    }
    return 0;
}

等差数列-2019省赛

https://www.lanqiao.cn/problems/192/learning/

题目描述

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。

现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

输入描述

输入的第一行包含一个整数 N。

输出描述

输出一个整数表示答案。

输入输出样例

示例

输入

5
2 6 4 10 20

输出

10

样例说明: 包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。

#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int a[N];
// 0 和另一个数的最大公约数都是另一个数
int d = 0;

// 欧几里得算法求最大公约数,这个需要背诵
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);

    sort(a, a + n);

    if (a[0] == a[n - 1]) {
        // 如果首尾相同的
        printf("%d", n);
    } else {
        // 否则就求他们的最小公倍数
        for (int i = 0; i < n - 1; i++) d = gcd(d, a[i + 1] - a[i]);
        // cout << d << endl;
        // 求队列
        cout << ((a[n - 1] - a[0]) / d) + 1 << endl;
    }

    return 0;
}

平方序列-2019国赛

https://www.lanqiao.cn/problems/808/learning/

题目描述

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

小明想找到两个正整数 X 和 Y,满足

  1. 2019 < X < Y;

请你求出在所有可能的解中,X + Y 的最小值是多少?

暴力解决,答案是7020

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

int res = 0x3f3f3f;

int main() {
    for (int x = 2019 + 1; x < 100000; x++)
        for (int y = x + 1; y < 100000; y++) {
            if ((y * y - x * x) == (x * x - 2019 * 2019)) {
                res = min(x + y, res);
            }
        }
    cout << res << endl;
    return 0;
}

倍数问题-2018省赛

https://www.lanqiao.cn/problems/168/learning/

题目描述

众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

输入描述

第一行包括 2 个正整数 n, K。

第二行 n 个正整数,代表给定的 n 个数。

输出描述

输出一行一个整数代表所求的和。

输入输出样例

示例

输入

4 3
1 2 3 4

输出

9
不会