202603-1 有限不循环小数
题目描述
若 可化为一个有限的,不循环的小数,则称 为终止数。
请你求出在 到 中终止数的数量。
输入格式
输入一行,包含两个整数 。
输出格式
输出一行,包含一个整数,表示 到 中终止数的数量。
样例输入 1
2 11样例输出 1
5提示
【样例解释】
在 终止数有 、、、、。
【数据范围】
保证 。
代码解析
这道题代码很简单,考察的重点是数论,一个数字如果是终止数,那么它的质因子只能有 和 ,通过题目给出的 2、4、5、8、10 花点时间思考也可以找到这个规律,所有我们只需要判断每个数字是否只包含 和 这两个质因子即可。
#include <bits/stdc++.h>using namespace std;bool check(int a) { while (a % 2 == 0) a /= 2; while (a % 5 == 0) a /= 5; if (a == 1) return true; return false;}int main() {
int l, r, cnt = 0; cin >> l >> r; for (int i = l; i <= r; i++) if (check(i)) cnt++; cout << cnt;
return 0;}202603-2 找数
题目描述
给定一个包含 个互不相同的正整数的数组 与一个包含 个互不相同的正整数的数组 ,请你帮忙计算有多少个数在数组 与数组 中均出现。
输入格式
第一行包含两个整数 。
第二行包含 个正整数 表示数组 。
第三行包含 个正整数 表示数组 。
输出格式
输出一个整数,表示在数组 与数组 中均出现的数的个数。
样例输入 1
3 54 2 33 1 5 4 6样例输出 1
2提示
【样例解释】
样例 1 中,、 在数组 与 中均出现。
【数据范围】
对于 的数据,保证 。
对于 的数据,保证 ,。
代码解析
这道题代码也很简单,我们先将数组 排序,然后对于数组 中的每个数 ,我们使用二分查找在数组 中查找是否存在 ,如果存在,那么 就是在数组 与数组 中均出现的数。
#include <bits/stdc++.h>using namespace std;int n, m, a[100005], cnt = 0;// 二分查找int search (int l, int r, int x) { while (l != r) { int mid = (l + r) / 2; if (a[mid] >= x) r = mid; else l = mid+1; } return l;}
int main() {
cin >> n >> m; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a+n); int b; for (int j = 0; j < m; j++){ cin >> b; if (a[search(0, n, b)] == b) cnt++; } cout << cnt;
return 0;}或者直接使用 STL 中的
lower_bound函数来实现二分查找,代码如下:
#include <bits/stdc++.h>using namespace std;int main() {
int n, m, a[100005], cnt = 0; cin >> n >> m; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a+n); int b; for (int j = 0; j < m; j++){ cin >> b; if (a[lower_bound(a, a+n, b)-a] == b) cnt++; } cout << cnt;
return 0;}202606-1 排排坐
题目描述
老师正在和小朋友们分糖果。
小朋友们先在自己的手上写一个数字,然后坐成一排。
老师分发糖果的规则是:每个小朋友获得自己以及左侧所有小朋友的手上数字之和个糖果。
现在小朋友们都已经在自己手上写上了数字。
请帮小朋友们安排合适的座位顺序,使得小朋友们分到的糖果总量最大,输出这个最大值。
输入格式
输入 行,
第一行为一个正整数 ,表示小朋友的个数;
第二行为 个正整数 ,表示小朋友们手上的数字,整数之间以空格分隔。
输出格式
输出一个整数,表示小朋友们可能分到的最大糖果总数量。
样例输入 1
57 5 8 9 3样例输出 1
111提示
【样例解释】
小朋友安排座位后从左向右每人手上数字依次是:。
这时可以得到最多的糖果:。
【数据范围】
,。
代码解析
贪心算法,每个孩子的糖果为他左边的所有孩子手上的的数字和,要想让每个孩子获得的糖果数量最多,我们需要将越大的数字排在越前面的位置,只需要从大到小排序,再计算即可。
#include <bits/stdc++.h>using namespace std;int main() {
int a[1005], n; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a+n, greater<int>());
int sum = 0, ans = 0; for (int i = 0; i < n; i++) { ans += a[i]; sum += ans; } cout << sum;
return 0;}202606-2 晚宴
题目描述
小明去参加晚宴。晚宴中有 个菜肴,每个菜肴都有一个美味度,第 个菜肴的美味度为 。
晚宴规定小明只能恰好选取两道菜肴,并且这两道菜肴的美味度必须要互质(即最大公约数为 )。
请帮助小明选取两道菜肴,使得两道菜肴美味度之和最大。
输入格式
输入 行,
第一行为一个正整数 ,表示菜肴的个数;
第二行为 个整数 表示菜肴的美味度,整数之间以空格分隔。
输出格式
输出一个整数,表示两道互质菜肴美味度之和的最大值。
样例输入 1
53 5 7 35 105样例输出 1
38提示
【样例解释 1】
最优选择是 和 。
注意到, 与其他任意菜肴的最大公约数都大于 ,因此无法参与合法选择。
【数据范围】
, 。
数据保证不存在相同美味度的菜肴。
数据保证至少存在一种选取两道菜肴的方案。
代码解析
互质数的判断使用辗转相除法,数据范围只有 ,直接暴力枚举即可。
#include <bits/stdc++.h>using namespace std;
bool isp(int a, int b) { while (a % b) { int t = a % b; a = b; b = t; } return b == 1;}
int main() {
int n, ans = 0, a[1005]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++) if (isp(a[i], a[j])) ans = max (ans , a[i]+a[j]);
cout << ans;
return 0;}
陕公网安备61010302001363号