列表

详情


NC231989. 牛牛变魔术

描述

牛牛是个魔术师,它拥有两个无限容量的瓶子  和  。有一天表演魔术,某位观众要求牛牛变出一瓶刚好装有  毫升的饮料。

此时,瓶子  装有  毫升的饮料,瓶子  装有  毫升的饮料,牛牛每次操作可以把其中一个瓶子的任意整数(可以是0)毫升的饮料倒入另一个瓶子,并且每次操作结束后,两个瓶子的饮料毫升都会增加一倍

例如:瓶子  有  毫升,瓶子  有  毫升,一次操作把瓶子  的  毫升倒入瓶子  ,此时瓶子  有  毫升,瓶子  有  毫升,操作结束的瞬间,瓶子  变为  毫升,瓶子  变为  毫升,此时一次完整的操作结束。

由于观众耐心有限,牛牛需要用最少的操作次数来变出一瓶刚好  毫升的饮料,你能告诉它吗?如果一开始瓶子  或者  已经有  毫升,那么操作次数是  。如果不管怎么操作,都无法达到  ,输出 

输入描述

第一行包括一个整数  ,表示询问的组数。

接下来  行,每行包括三个整数   

输出描述

对于每组询问输出一行,表示最小操作次数。

示例1

输入:

2
1 3 1
4 4 2

输出:

0
1

说明:

   已经有一个瓶子达到  的要求,不用操作,输出  。

   瓶子  倒入  毫升给瓶子  ,变成   ,在结束的瞬间变成   次操作即可。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 60ms, 内存消耗: 4588K, 提交时间: 2023-08-11 16:20:03

for i in range(int(input())):
    x, y, z = map(int,input().split())
    if x == z or y == z: print(0)
    elif z % 2 == 1: print(-1)
    else:
        l = 1 
        while ( (x+y) << l ) < z: l+=1
        print(l)

Java 解法, 执行用时: 215ms, 内存消耗: 18700K, 提交时间: 2023-08-11 16:18:50

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int t=sc.nextInt();
		while(t-->0) {
			long a=sc.nextLong();
			long b=sc.nextLong();
			long ta=sc.nextLong();
			long x=a+b;
			int cnt=0;
			while(x<ta/2) {
				x*=2;
				cnt++;
			}
			cnt++;
			if(ta==a||ta==b)cnt=0;
            else if(ta%2!=0)cnt=-1;
			System.out.println(cnt);
		}
	}
}

上一题