A. Little Nikita
题意:
小男孩尼基塔得到了一些立方体作为礼物。他决定用它们建一座塔。一开始,塔上没有任何立方体。在一次移动中,尼基塔要么正好把 1 1 1 个立方体放到塔顶,要么正好从塔顶移走 1 1 1个立方体。有没有可能在走了 n n n步之后,塔顶正好有 m m m个立方体?
题解:
签到题,没什么好说的。
代码:
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1e5 + 6;
int t, n;
int a[MAXN];
void solve()
{
int n,m;
cin>>n>>m;
if(n>=m&&(n-m)%2==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
int main()
{
int t;
cin>>t;
while(t--) solve();
return 0;
}
B. Binary Colouring
题意:
给你一个正整数
x
x
x 。请找出下列条件成立的任意整数数组
a
0
a_{0}
a0,
a
1
a_{1}
a1,
a
2
a_{2}
a2…
a
n
−
1
a_{n-1}
an−1。
- 1 ≤ n ≤ 32 1 \le n \le 32 1≤n≤32。
- 对于所有的 a i a_{i} ai的值只能为 − 1 , 0 , 1 -1,0,1 −1,0,1。
- x = x= x= ∑ i = 0 n − 1 ( x i ∗ 2 i ) \sum_{i=0}^{n-1}(x_i*2^i) ∑i=0n−1(xi∗2i)。
- 不存在一个索引
0
≤
i
≤
n
−
2
0 \le i \le n - 2
0≤i≤n−2 同时存在
a
i
!
=
0
a_{i}!=0
ai!=0,且
a
i
+
1
!
=
0
a_{i+1} !=0
ai+1!=0。
可以证明,在问题的限制条件下,总是存在一个有效的数组。
题解:
先将x转化成二进制,对于连续的1,即 a i = 1 a_{i}=1 ai=1, a i + 1 = 1 a_{i+1}=1 ai+1=1,可以变为 a i = − 1 a_{i}=-1 ai=−1, a i + 1 = 0 a_{i+1}=0 ai+1=0, a i + 2 = 1 a_{i+2}=1 ai+2=1。根据这个规则遍历二进制即可。
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
void solve(){
int x;
vector<int> ans;
cin>>x;
while(x){
ans.push_back(x%2);
x/=2;
}
for(int i=0;i<(int)ans.size()-1;i++){
if(ans[i]==2){
ans[i]=0;
ans[i+1]+=1;
}
else if(ans[i]==1&&ans[i+1]==1){
ans[i+1]+=1;
ans[i]=-1;
}
}
if(ans.back()==2){
ans.pop_back();
ans.push_back(0);
ans.push_back(1);
}
cout<<ans.size()<<endl;
for(auto t:ans) cout<<t<<" ";
cout<<endl;
}
signed main(){
int t;
cin>>t;
while(t--) solve();
return 0;
}