AtCoder Beginner Contest 350 A - D
A. Past ABCs
思路:
判断字符串后面的数是否大于等于1,小于等于349,特判316即可。
#include <bits/stdc++.h>
using namespace std;
int check(string s)
{
if (s.substr(0, 3) != "ABC") return 0;
string op = s.substr(3, 3);
int n = stoi(op);
if (n >= 1 && n <= 349 && n != 316) return 1;
else return 0;
}
void solve()
{
string s; cin >> s;
if (check(s)) cout << "Yes\n";
else cout << "No\n";
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
solve();
return 0;
}
B. Dentist Aoki
思路:
题目要求有牙齿拔掉,没有牙齿插入。如果这一个操作在同一个位置相当于没有变化。因此当某个位置出现的次数时2的倍数时,没有变化,这里可以采用一个桶来记录。我们最终只需要记录没有牙齿的位置的个数即可。
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n, q;
cin >> n >> q;
unordered_map<int, int> um;
for (int i = 1; i <= q; i++)
{
int x; cin >> x;
um[x]++;
}
int cnt = 0;
for (auto &[k, v] : um)
{
if (v % 2 == 0) continue;
cnt++;
}
cout << n - cnt << endl;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
solve();
return 0;
}
C. Sort
思路:
开一个桶维护数上的位置,最后顺序查看数上的位置是不是顺序的,若不是,则交换位置同时存储被交换的数即可。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#define pii pair<int, int>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
vector<int> a(n + 1), p(n + 1);
vector<pii> res;
for (int i = 1; i <= n; i++) cin >> a[i], p[a[i]] = i;
for (int i = 1; i <= n; i++)
{
if (p[i] == i) continue;
res.emplace_back(i, p[i]);
int t = p[i];
swap(p[i], p[a[i]]), swap(a[i], a[t]);
}
cout << res.size() << "\n";
for (auto k : res)
cout << k.first << " " << k.second << "\n";
}
D. New Friends
思路:
好友之间相互练一条线,那么当所有人都是好友的时候,线的数量就是无向图的完全图的边数 n * (n - 1) / 2, 要求新建立好友的线,我们只需要把原本好友的线减去即可。而原本好友的线可以采用并查集来维护。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int p[N], sz[N], cnt[N];
int n, m;
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) p[i] = i, sz[i] = 1;
for (int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
int pa = find(a), pb = find(b);
if (pa == pb) cnt[pa]++;
else
{
p[pa] = pb;
cnt[pb] += cnt[pa];
sz[pb] += sz[pa];
}
}
int res = 0;
for (int i = 1; i <= n; i++)
if (find(i) == i)
res += sz[i] * (sz[i] - 1) / 2 - sz[i] + 1 - cnt[i];
cout << res << "\n";
}