zoukankan      html  css  js  c++  java
  • 题解 CF1362A 【Johnny and Ancient Computer】

    这题貌似没什么好讲的= =

    大概就是对于每对 (a, b) 只可能有如下 (3) 种情况:

    a > b

    此时显然可以知道你只会进行 (a -> a / 2), (a -> a / 4) 或者 (a -> a / 8)(3) 种操作

    然后根据贪心, 如果可以进行 (a -> a / 8) 操作, 并且变完以后 (a) 还是保证 (a > b) 那就用这个操作

    (a -> a / 2)(a -> a / 4) 都是一个道理

    a < b

    此时显然可以知道你只会进行 (a -> a * 2), (a -> a * 4) 或者 (a -> a * 8)(3) 种操作

    还是根据贪心可以先尝试 (a -> a * 8) 然后依次尝试 (a -> a * 2)(a -> a * 4)

    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <map>
    #define N 1010
    #define M 5000010
    #define ls x << 1
    #define rs x << 1 | 1
    #define inf 0x3f3f3f3f
    #define inc(i) (++ (i))
    #define dec(i) (-- (i))
    #define mid ((l + r) >> 1)
     #define int long long
    //#define ll long long
    #define XRZ 10000000000000
    #define pai acos(-1)
    #define debug() puts("XRZ TXDY");
    #define mem(i, x) memset(i, x, sizeof(i));
    #define Next(i, u) for(register int i = head[u]; i ; i = e[i].nxt)
    #define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout);
    #define Rep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i <= i##Limit ; inc(i))
    #define Dep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i >= i##Limit ; dec(i))
    using namespace std;
    inline int read() {
        register int x = 0, f = 1; register char c = getchar();
        while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar(); 
        return x * f;
    }
    int dx[10] = {0, 1, 1, 2, 2, -1, -1, -2, -2};
    int dy[10] = {0, 2, -2, 1, -1, 2, -2, 1, -1};
    
    signed main() { int T = read();
    	while(T --) { int a = read(), b = read(), ans = 0;
    		if(a == b) puts("0");
    		if(a > b) {
    			while(a >= b) {
    				if(a % 8 == 0 && a / 8 >= b) a /= 8, ans ++;//可以除8就除8 
    				else if(a % 4 == 0 && a / 4 >= b) a /= 4, ans ++;//可以除4就除4 
    				else if(a % 2 == 0 && a / 2 >= b) a /= 2, ans ++;//可以除2就除2
    				else break;//如果2都除不了,那么要么已经成立,要么永远都存在不了 
    			} if(a != b) { puts("-1"); continue;} else printf("%d
    ", ans);
    		}
    		if(a < b) {
    			while(a <= b) {
    				if(a * 8 <= b) a *= 8, ans ++;//乘法同上 
    				else if(a * 4 <= b) a *= 4, ans ++;
    				else if(a * 2 <= b) a *= 2, ans ++;
    				else break;
    			} if(a != b) { puts("-1"); continue;} else printf("%d
    ", ans);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    python 循环的概念
    python 字典的基本操作
    短路表达式
    快捷键myeclipse
    nginx静态文件访问
    安装mysql
    安装mongodb
    安装tomcat
    安装jdk8
    安装node和pm2
  • 原文地址:https://www.cnblogs.com/Flash-plus/p/13834276.html
Copyright © 2011-2022 走看看