猴子分香蕉-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,满足
- 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
不会