A - Edge CheckerA - Edge Checker
题目大意
题目要求判断在一个给定的图中,是否存在直线段连接了编号为a和b的两个点。
思路分析
- 在给定的图中,相邻的点之间通常是通过直线段连接的。
- 如果两个点的编号之差为1或9,则它们是相邻的点,并且可以通过直线段连接。
时间复杂度
O(1)
可AC代码
#include <iostream>
using namespace std;
int main(void)
{
int a, b;
cin >> a >> b;
if(b-a == 1 || b-a == 9) cout << "Yes" << endl; // 判断b-a是否等于1或9
else cout << "No" << endl;
return 0;
}
B - Count Distinct IntegersB - Count Distinct Integers
题目大意
题目要求在一个包含N个正整数的序列中,有多少个不同的整数。
思路分析
可以使用集合(Set)来存储序列中的不同整数。由于集合不允许重复元素,可以利用该特性来去除重复的整数,并返回集合的大小作为结果。
时间复杂度
O(N)
可AC代码
#include <iostream>
#include <set>
using namespace std;
int main() {
int n;
cin >> n;
set<int> a;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
a.insert(x);
}
cout << a.size() << '\n';
}
C - Jumping TakahashiC - Jumping Takahashi
题目大意
题目要求判断在N次跳跃后,是否可能到达坐标X。每次跳跃可以选择向前移动ai或bi的距离。
思路分析
可以使用动态规划来解决这个问题。
首先,定义一个长度为X+1的dp数组,dp[i]表示能否到达坐标i。
然后,遍历每次跳跃的两种距离ai和bi,以及目标坐标nx。对于每个nx,检查是否可以通过跳跃到达nx+a[i]或nx+b[i],并将对应的dp值设置为1,表示可以到达。
时间复杂度
O(NX)
可AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> Pair;
int main() {
ll N, X;
cin >> N >> X;
vector<ll> a(N), b(N);
for (ll i = 0; i < N; i++) {
cin >> a[i] >> b[i];
}
vector<ll> dp(X + 1);
dp[0] = 1; // 初始位置为可以到达
for (ll i = 0; i < N; i++) {
vector<ll> p(X + 1); // 创建临时数组p,用于存储上一次更新的dp值
swap(dp, p); // 通过交换指针,实现空间复用
for (ll nx = 0; nx <= X; nx++) {
if (nx + a[i] <= X) {
dp[nx + a[i]] |= p[nx]; // 更新dp值
}
if (nx + b[i] <= X) {
dp[nx + b[i]] |= p[nx]; // 更新dp值
}
}
}
cout << (dp[X] ? "Yes" : "No") << endl;
return 0;
}