A. 3988. 不同的数
题目链接:https://www.acwing.com/problem/content/3991/
题目大意:从n个数中找出k个不同的数,输出下标。
解题思路:用 set 记录有没有出现过,用 vector 保存数据。
示例程序:
#include <bits/stdc++.h>
using namespace std;
int n, k, a, cnt;
set<int> st;
vector<int> vec;
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a;
if (!st.count(a)) {
st.insert(a);
vec.push_back(i);
cnt++;
if (cnt == k) {
cout << "YES" << endl;
for (auto e : vec) cout << e << " ";
return 0;
}
}
}
cout << "NO" << endl;
return 0;
}
B. 3989. 看图做题
题目链接:https://www.acwing.com/problem/content/3992/
题目大意:看图做题。
解题思路:找规律。(根据 \(1 \rightarrow 13 \rightarrow 37\) 找了以下规律然后就过了,见代码)
示例程序:
#include <bits/stdc++.h>
using namespace std;
int n, m;
int main() {
cin >> n;
m = 1;
for (int i = 2; i <= n; i++)
m += (i - 1) * 12;
cout << m << endl;
return 0;
}
C. 3990. 砍树
题目链接:https://www.acwing.com/problem/content/3993/
题目大意:一棵树,且尽量多的边,使得剩下的连通块都包含偶数个点。
解题思路:以节点 \(1\) 为根节点 dfs 一遍求出所有 \(sz_i\) 表示以 \(i\) 为根节点的子树大小。则对于任意 \(i \ge 2\) 且 \(sz_i\) 为偶数的点,都可以删除 \(i\) 连向其父节点的那条边。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n, sz[maxn], cnt;
vector<int> g[maxn];
void dfs(int u, int p) {
sz[u] = 1;
for (auto v : g[u])
if (v != p)
dfs(v, u), sz[u] += sz[v];
}
int main() {
cin >> n;
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
if (n % 2) {
cout << -1 << endl;
return 0;
}
dfs(1, -1);
for (int i = 2; i <= n; i++)
if (sz[i] % 2 == 0)
cnt++;
cout << cnt << endl;
return 0;
}