蓝桥杯打卡-Day5

猴子分香蕉-2018省赛

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

题目描述

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

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

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

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

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

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

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

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

暴力解决,答案是3141

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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。

输出描述

输出一个整数表示答案。

输入输出样例

示例

输入

1
2
5
2 6 4 10 20

输出

1
10

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 个数。

输出描述

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

输入输出样例

示例

输入

1
2
4 3
1 2 3 4

输出

1
9
1
不会