codeforces round 934 diiv2(a,b,c)

b b b c c c难调,赛时 b b b卡了半天, c c c更好想一些
比赛链接

A

题目大意

n n n个点,任意一对点之间均由一条线链接,给定 k k k次切断,从初始点开始,能到达的最小岛屿数量

思路

每一点均为 n − 1 n-1 n1条线连接

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 x1中不能有 出现 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;
}
  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值