A.Little Nikita
题意:
一共可以走n步,每走一步可以放置或者取走一个方块,n步后是否可以得到m个方块。
思路:
设+1次数为x,-1次数为y。
x+y=n , x-y=m
x=(n+m)/2 , y=(n-m)/2
保证(n+m)和(n-m)为偶数,并且n>=m。
代码:
#include <bits/stdc++.h>
using namespace std;
#define inf INT_MAX
typedef long long ll;
typedef unsigned long long ull;
const int N = 1e5 + 10;
const int M = 1e3 + 10;
const int mod = 1000000007;
int n, m;
void solve()
{
cin >> n >> m;
if ((n + m) % 2 == 0 && n >= m)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
B.Binary Colouring
题意:
给一个正整数x,是否可以构造一个由-1,0,1组成的二进制,求和得x,并且数组中不能出现连续不为0的情况。
思路:
先标记组成x的二进制位置。
若区间 [
a
l
a_{l}
al ,
a
r
a_{r}
ar] 标记全为1时,可以转化为
a
l
a_{l}
al = -1,
a
r
+
1
a_{r+1}
ar+1 = 1。
由于题目说数组中不能出现连续不为0的情况,需要考虑 i 和 i+1 处的值:
若
a
i
a_{i}
ai = -1,
a
i
+
1
a_{i+1}
ai+1 = 1,等价于
a
i
a_{i}
ai = 1,
a
i
+
1
a_{i+1}
ai+1 = 0。
若
a
i
a_{i}
ai = 1,
a
i
+
1
a_{i+1}
ai+1 = -1,等价于
a
i
a_{i}
ai = -1,
a
i
+
1
a_{i+1}
ai+1 = 0。
证明:
-
2
i
2^{i}
2i +
2
i
+
1
2^{i+1}
2i+1 = -
2
i
2^{i}
2i + 2 *
2
i
2^{i}
2i =
2
i
2^{i}
2i
2
i
2^{i}
2i -
2
i
+
1
2^{i+1}
2i+1 =
2
i
2^{i}
2i - 2 *
2
i
2^{i}
2i = -
2
i
2^{i}
2i
代码
#include <bits/stdc++.h>
using namespace std;
#define inf INT_MAX
typedef long long ll;
typedef unsigned long long ull;
const int N = 40;
const int M = 1e3 + 10;
const int mod = 1000000007;
int a[N], ans[N];
ll x;
void solve()
{
memset(a, 0, sizeof(a));
memset(ans, 0, sizeof(ans));
cin >> x;
for (int i = 0; i < 32; i++)
{
if ((x >> i) & 1)
{
a[i] = 1;
}
// cout<<"i: "<<i<<" a[i]: "<<a[i]<<endl;
}
for (int i = 0; i < 32; i++)
{
if (a[i])
{
int len = 0;
while (i < 32 && a[i])
{
len++;
i++;
}
ans[i] = 1;
ans[i - len] = -1;
}
}
for (int i = 0; i < 31; i++)
{
if (ans[i] == 1 && ans[i + 1] == -1)
{
ans[i] = -1, ans[i + 1] = 0;
}
else if (ans[i] == -1 && ans[i + 1] == 1)
{
ans[i] = 1, ans[i + 1] = 0;
}
}
cout << 32 << endl;
for (int i = 0; i < 32; i++)
{
cout << ans[i] << " ";
}
cout << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
1158

被折叠的 条评论
为什么被折叠?



