AC了前三道题,D题采用了建树的方法,所以有一半用例超时;E题没什么思路而且没什么时间了就没来得及做了。
A ⽃⽜
给定五个 0~9 范围内的整数 a1, a2, a3, a4, a5。如果能从五个整数中选出三个并且这三个整数的和为 10 的倍数(包括 0),那么这五个整数的权值即为剩下两个没被选出来的整数的和对 10 取余的结果,显然如果有多个三元组满⾜和是 10 的倍数,剩下两个数之和对 10 取余的结果都是相同的;如果 选不出这样三个整数,则这五个整数的权值为 -1。
现在给定 T 组数据,每组数据包含五个 0~9 范围内的整数,分别求这 T 组数据中五个整数的权值。
【输⼊格式】
第⼀⾏⼀个整数 T (1<=T<=1000),表⽰数据组数。
接下来 T ⾏,每⾏ 5 个 0~9 的整数,表⽰⼀组数据。
【输出格式】
输出 T ⾏,每⾏⼀个整数,表⽰每组数据中五个整数的权值。
【样例输⼊】
4
1 0 0 1 0
1 0 0 8 6
3 4 5 6 7
4 5 6 7 8
【样例输出】
2
【时空限制】
2500ms,256MB
//解题思路:由于数组大小只有5,尝试暴力解法
#include <iostream>
using namespace std;
int main() {
int T, a[5];
cin >> T;
//T组数据
while (T--) {
int sum = 0, flag = 0, ans;
for (int i = 0; i < 5; i++) {
cin >> a[i];
sum += a[i];
}
//从5个数中选出3个进行判断
for (int i = 0; i < 5; i++) {
for (int j = i + 1; j < 5; j++) {
for (int k = j + 1; k < 5; k++) {
int sumOfThree = a[i] + a[j] + a[k];
if (sumOfThree % 10 == 0) {
flag = 1;
ans = (sum - sumOfThree) % 10;
break;
}
}
}
}
if (flag == 0) cout << -1 << endl;
else cout << ans << endl;
}
return 0;
}
B 打地鼠
给定 n 个整数 a1, a2, …, an 和⼀个 d,你需要选出若⼲个整数,使得将这些整数从⼩到⼤排好序之 后,任意两个相邻的数之差都不⼩于给定的 d,问最多能选多少个数出来。
【输⼊格式】
第⼀⾏两个整数 n,d (1<=n<=10^5, 0<=d<=10^9),分别表⽰整数个数和相邻整数差的下界。
第⼆⾏ n 个整数 a1, a2, …, an (1<=ai<=10^9, 1<=i<=n),表⽰给定的 n 个整数。
【输出格式】
仅⼀⾏⼀个整数,表⽰答案。
【样例输⼊】
6 2
1 4 2 8 5 7
【样例输出】
3
【时空限制】
2500ms,256MB
//解题思路:动态规划 + 贪心算法
#include <iostream>
using namespace std;
const int MAXN = 100010;
int a[MAXN], dp[MAXN];
int main(){
int n, d;
cin >> n >> d;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
dp[0] = 1;
for (int i = 1; i < n; i++) {
if (a[i] -
ACM竞赛算法解析

本文详细解析了ACM竞赛中的五道题目,包括斗牛、打地鼠、排队打饭、二叉搜索树和序列问题,提供了每道题目的算法思路、代码实现以及优化方案。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



