CodeForces.1810B.糖果.[中等][ifelse选择][注意输出格式]

题目描述:


解题思路:

题目解读:

初始状态只有一个糖果,即x=1,给定想要获得的总糖果数y

只能进行两种操作,分别是做2x-1和2x+1。给出从 x=1 到 目标数字 y 的操作步数和具体步骤。

示例1 从1到2,不可能实现,输出-1。

示例2 从1到3,一步操作2x+1即可。

示例3 从1到7,先2x+1,再2x+1即可。

找规律,2x-1和2x+1得到的都是奇数,因此这个算法只能对奇数生效,当y为偶数时,直接输出-1。正确路径每次得到的数都是奇数

我们可以从终点反推起点 x=(1+-y)/2,每一步正确与否,依靠倒推结果是否为奇数来判定。

为奇数则继续下一步反推,为偶数则选择另一条路径进行反推,直到得到1。

最后的输出:记录步数i++即可实现,具体的倒推步骤则需要封装成数组,最后再倒序输出

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define MAX 40
void Solve() {
	int i=0,y;  //i用来记录步数,y记录目标
	int a[MAX]; //数组记录具体步骤
	scanf("%d", &y);

	if ( y % 2 == 0) { //偶数,直接输出-1
		printf("-1\n");
		return;
	}

	while(y!=1) { //奇数,且不为1
		if (((y + 1) / 2) % 2 == 1) {  //尝试走步骤1,满足则进行反推,同时i++,赋值a[i]
			y = (y + 1) / 2;
			a[i++] = 1;
		}
		else { //步骤1不满足,则走步骤2进行反推,同时i++,赋值a[i]
			y = (y - 1) / 2;
			a[i++] = 2;
		}
	}

	printf("%d\n", i); //输出步数
	while (i--) //循环输出具体步骤
	{
		printf("%d ", a[i]);
	}
	return;
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) Solve();
	return 0;
}

遇到的错误:

要注意输入输出的格式问题,根据题目要求给定的output,这里-1输出时,后面带有\n换行,否则报错。

结果步骤采用数组保存,存储后倒序输出即可,每个步骤间的空格若采用\t。空间过大,输出中加空格即可(即"%d ")。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值