A. Brick Wall
一道贪心的签到题,直接放代码
#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
其实就是将数组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
我们先将输入的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;
}