codeforces round 948(div.2)

https://m1.codeforces.com/contest/1977

A:

题意:

小男孩尼基塔得到了一些立方体作为礼物。他决定用它们建一座塔。

一开始,塔上没有任何立方体。在一次移动中,尼基塔要么正好把 1 个立方体放到塔顶,要么正好从塔顶移走 1个立方体。有没有可能在走了 n 步之后,塔顶正好有 m 个立方体?

分析:

如果小男孩每次都选择把一个立方体放到塔顶,那么,n次后,塔顶将会有最多数量的立方体(m1=n),如果小男孩一次放下,一次拿走,塔顶将会有最少数量的立方体,此时有两种情况,n为奇数时, m2=1;n为偶数时,m2=0。在m2-m1的区间内,以2递增得到的所有值均为可以达到的。

故,对于一个数值m进行分析,如果m大于n,则必然不可能,输出否;如果小于n,判断n-m是否为2 的倍数,若是,则输出yes,否则输出no。

代码实现:

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
	int tt;
	cin >> tt;
	while(tt--)
	{
		int n,m;
		cin >> n >> m;
		if(m>n)
		cout << "No" << endl;
		else if((n-m)%2==0)
		{
			cout << "Yes" << endl;
		}
		else
		cout << "No" << endl;
	}
	return 0;
}

B:

题意:

给定一x,x<=2^30,将x分解为若干个2的次方项,各项的系数可以为-1,0,1,并且连续两项的系数不能均不为零。将系数按照0次方,1次方,2次方...的顺序进行排列,输出这组数据的个数和每一个系数的值。

分析:

对于任意一个数,我们可以将其分为以下三种情况:
1.   x是2的倍数 。

2.(x-1)/2是2 的倍数。

3.(x+1)/2是2 的倍数。

不断对x进行操作使得x为2的倍数,x/2,直到x=0;

代码实现:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int tt;
	cin >> tt;
	while(tt--)
	{
		long long int x;
		cin >> x;
		vector<int> a;
		while(x)
		{
			if(x%2==0)
			a.push_back(0);
			else{
				if((x-1)/2%2==0) //要使改变后的x/2为2的倍数,保证下一个系数不为1或-1
				{
					x--;
					a.push_back(1);//x值减小,此时对应次方项系数应为1
				}
				else{
					x++;
					a.push_back(-1);//x值增大,此时对应次方项系数应为-1
				}
			}
			x/=2;
		}
		int len=a.size();
		cout << len << endl;
		for(int i=0;i<len;i++)
		{
			cout << a[i] <<' ';
		}
		cout << endl;
	}
}

24/5/27

  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值