Codeforces Round 922 (Div. 2)(A~C题解)

A. Brick Wall

Problem - A - Codeforces

一道贪心的签到题,直接放代码

#include<iostream>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#define ll long long
using namespace std;
const int N = 200010;
const int M = 100100;
const ll mod = 1e9 + 7;
ll a[N], b[N];
void solve() 
{ 
    ll n,k;
    cin >> n >> k;
    cout << n * (k / 2) << "\n";
}
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}

B. Minimize Inversions

Problem - B - Codeforces

其实就是将数组a排序,b跟着更换位置即可

#include<iostream>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#define ll long long
using namespace std;
const int N = 200010;
const int M = 100100;
const ll mod = 1e9 + 7;

ll a[N], b[N];
void solve()
{
    
    int n;
    cin >> n;

    vector<pair<ll, ll>>q(n);
    for (int i = 0; i < n; i++) cin >> q[i].first;
    for (int i = 0; i < n; i++) cin >> q[i].second;
    sort(q.begin(), q.end());
    for (int i = 0; i < n; i++)
        cout << q[i].first << " ";
    cout << "\n";
    for (int i = 0; i < n; i++)
    {
        cout << q[i].second << " ";
    }
    cout << "\n";

}
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}

C. XOR-distance

Problem - C - Codeforces

我们先将输入的a和b转化成二进制模拟一下,是不是发现a如果大于b,那么二进制一定有一个高于b的1位,反之亦然,a和b的二进制位如果相同,异或同一个数是不会发生变化的,所以我们要去找不同的位。

如果a>b,先跳过a从左到右第一个1位,并且这个位置b是0位,为了保证a还是大于b,但是会通过后面的不同的位与去缩小他们两的差距,当遇到第二个或者大于二个的这样的位置,那么我们就判断这个位置r的范围可不可以达到,如果可以a和b都异或一下,拿一个累加数组添加当前二进制位置为1的十进制数。

最后输出b-a就是答案,注意数据范围需要用long long。

AC代码:

#include<iostream>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#define ll long long
using namespace std;
const int N = 200010;
const int M = 100100;
const ll mod = 1e9 + 7;
ll a[N], b[N];
void solve()
{
    ll n, m, k;
    cin >> n >> m >> k;

    if (k == 0)
    {
        cout << abs(n - m) << "\n";
        return;
    }

    if (n > m) swap(n, m);
    ll f = 0, x = 0;
    for (int i = 59; i >= 0; i--)
    {
        bool a = n & (1ll << i);
        bool b = m & (1ll << i);
        if (a != b)
        {
            if (!f)
            {
                f = 1;
            }
            else
            {
                if (!a && x + (1ll << i) <= k)
                {
                    x += (1ll << i);
                    n ^= (1ll << i);
                    m ^= (1ll << i);
                }
            }
        }
    }
    cout << m - n << "\n";

}
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值