b
b
b比
c
c
c难调,赛时
b
b
b卡了半天,
c
c
c更好想一些
比赛链接
A
题目大意
有 n n n个点,任意一对点之间均由一条线链接,给定 k k k次切断,从初始点开始,能到达的最小岛屿数量
思路
每一点均为 n − 1 n-1 n−1条线连接
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int a, b;cin >> a >> b;
if (b >= a - 1)cout << 1 << '\n';
else cout << a << '\n';
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
B
题目大意
给定长度 2 n 2n 2n的数组 c c c,由 1 1 1~ n n n组成,每个数字严格出现两次(位置不确定),给定 k k k,找到长度为 2 k 2k 2k的数组 a , b a,b a,b,使得满足以下条件
- a a a是 c [ 1 ] , c [ 2 ] . . . c [ n ] c[1],c[2]...c[n] c[1],c[2]...c[n]的子集
- b b b是 c [ n + 1 ] , c [ n + 2 ] . . . c [ 2 n ] c[n+1],c[n+2]...c[2n] c[n+1],c[n+2]...c[2n]的子集
- a a a与 b b b按位异或运算结果相等
思路
异或运算,相同得
0
0
0,不同得
1
1
1
所有数根据出现位置可分为以下几类
- 一次在 1 1 1 ~ n n n,一次在 n + 1 n+1 n+1 ~ 2 n 2n 2n,那就一个在第一数组输出,一个到第二数组输出
- 两次均在 1 1 1 ~ n n n或 n + 1 n+1 n+1 ~ 2 n 2n 2n,直接放到第一数组或第二数组
需要注意的是,因为我们要输出 2 k 2k 2k个答案,而对于第二种情况我们是两个两个向数组添加的,所以第一种情况讨论完后需要加判断,若元素为奇数个要删除一个
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n, k;cin >> n >> k;
vector<int>a(n + 9), b(n + 9);
map<int, int>ma, mb;
ma.clear(), mb.clear(), a.clear(), b.clear();
for (int i = 1;i <= n;i++)cin >> a[i], ma[a[i]]++;
for (int i = 1;i <= n;i++)cin >> b[i], mb[b[i]]++;
vector<int>ca, cb;
ca.clear(), cb.clear();
for (int i = 1;i <= n;i++) {
if (ma[i] == 1)ca.push_back(i), cb.push_back(i);
}
if (ca.size() % 2 == 1 && ca.size() < 2 * k)ca.pop_back(), cb.pop_back();
for (int i = 1;i <= n;i++) {
if (ma[i] == 2)ca.push_back(i), ca.push_back(i);
}
for (int i = 1;i <= n;i++) {
if (mb[i] == 2)cb.push_back(i), cb.push_back(i);
}
for (int i = 0;i < 2 * k;i++)cout << ca[i] << ' ';
cout << '\n';
for (int i = 0;i < 2 * k;i++)cout << cb[i] << ' ';
cout << '\n';
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
C
题目大意
给定 n n n个元素的数组 a a a和空数组 c c c,先手操作把 a a a中一个元素移动到 c c c中,后手在 a a a中删除某个元素,当数组 a a a为空时结束,定义 M E X MEX MEX为数组中不出现的最小非负整数,先手希望这个值尽可能大,后手希望尽可能下,若均为最佳操作,问最大值是多少
思路
若 M E X MEX MEX能到达 x x x,则要求 1 1 1 ~ x − 1 x-1 x−1中不能有 出现 0 0 0次的元素和出现次数为 1 1 1的元素不能超过两个
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n;cin >> n;
vector<int>a(n + 3), b(n + 3);
for (int i = 1;i <= n;i++)cin >> a[i], b[a[i]]++;
int ans = 0;int nt = 0;
for (int i = 0;i <= n;i++) {
if (b[ans] == 0)break;
if (b[ans] == 1)nt++;
if (nt >= 2)break;
ans = i + 1;
}
cout << ans << '\n';
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}