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); } } }