A. Little Nikita
题意:有n次机会,每次可以选择放一个方块或者拿走一个,问最后是否可以有m个方块
思路:如果n<m,显然不行。再看n>=m的情况,可以先假定放刚好m个,在思考是否可以在接下来的步骤使方块数不变。注意到当n-m为偶时可以,为奇时不行。
B. Binary Colouring
题意:构造题,懒得描述了,直接看,其中第三条可以转换成不存在连续的1或-1
思路:首先先将给定的x转换成2进制,通过观察可以得到一个性质,就是两个连续的1可以通过下下方法转成不连续:
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int t;
cin>>t;
while(t--)
{
ll n,pre=0;
cin>>n;
vector<int>a;
for(int i=0;(1<<i)<=n;i++)
{
if((n&(1<<i))==0)
{
a.push_back(0);
}
else
{
a.push_back(1);
}
}
a.push_back(0);
for(int i=1;i<a.size();i++)
{
if(a[i]==a[i-1]&&a[i]==1)
{
a[i-1]=-1;
a[i+1]+=1;
a[i]=0;
}
else if(a[i]==2)
{
a[i]=0;
a[i+1]+=1;
}
}
if((*(--a.end()))==0)
a.pop_back();
cout<<a.size()<<"\n";
for(auto ed:a)
{
cout<<ed<<" ";
}
cout<<"\n";
}
}
C. Nikita and LCM
题意:给定一个数组,找到一个子数组,需使这个子数组的lcm(最小公倍数)不存在于给定的数组,问这个子数组的最大长度是多少
思路:对这个题目加以思考可以发现,如果直接从这个数组中挑选某些数出来判断这个数组的lcm是否存在于原数组中显然会超时。于是考虑枚举lcm,判断对于每个lcm有多少个数成立即可。
D. XORificator
题意:
思路:有个非常重要的性质,对于某一列,假设确定了这一列的哪一行有1,那么这个图已经可以确定了。所以我们可以暴力枚举每一个位置让它为1,然后得到这个图的答案,最后找到那个最大值即可。由于翻转是对于每行翻转,可以用哈希。