zoukankan      html  css  js  c++  java
  • 2595 X之于Y 思维

    小Y上课无聊摸鱼,他在纸上随意写下了两个数字X和Y。现在他想把X通过某种方法变成Y,为了把让这个过程更加有趣,所以他限定自己只能使用两种操作:

    1、把当前X乘二

    2、把当前X减一

    因为课堂上的时间有限,所以他用了最少的操作次数实现这一过程。下课后,路过的qz看到了小Y纸上写着的X和Y,他一秒钟以内就知道了小Y用了多少次操作。那么问题来了,小Y到底用了多少次操作呢?

     

    输入

    两个数字表示X和Y
    其中
    1<= X <= 1,000,000,000
    1<= Y <= 1,000,000,000

    输出

    一个数字,表示把X变成Y最少需要多少次操作

    输入样例

    1 1000000000

    输出样例

    39


    考虑由y变成x,那么只有2种操作:1.y/=2 2.y+=1 ;
    当y为奇数,那么只能执行第二种:y+=1变为偶数
    当y为偶数,考虑将其变为y/2,那么直接除即可;如果变成y/2+1,第一种就是先除再加 1,操作为2步;否则就是加2然后再/2,操作为3步;
    所以对于偶数的情况,先除再加更优;
    那么整个解法就出来了:对于是偶数的就/2,对于y<x的情况,就加上(x-y)即可;
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<string>
    using namespace std;
    const int maxn = 2010;
    typedef long long ll;
    #define rdint(x) scanf("%d",&x)
    #define inf 0x3f3f3f3f
    int x, y;
    
    int main()
    {
    	rdint(x); rdint(y);
    	int minn = inf;
    	int cnt = 0;
    	while (1) {
    		if (x == y)break;
    		if (y % 2 == 0 && y > x) {
    			cnt++; y /= 2;
    		}
    		else if (y > x&&y % 2 == 1) {
    			cnt++; y += 1;
    		}
    		else if (y < x) {
    			cnt += (x - y);
    			y = x; break;
    		}
    	}
    	cout << cnt << endl;
    	system("pause");
    //	return 0;
    }
    

      


  • 相关阅读:
    mysql视图产生派生表无法优化案例
    根据.frm .ibd文件恢复表
    binlog内容时间乱序问题排查
    mysql官方的测试数据库employees超30万的数据,安装方法介绍
    数据库大量Waiting for table flush 状态SQL问题排查
    mysql搭建从库并配置ssl
    MySQL lOAD DATA详解
    redis eval
    aws-rds for mysql 5.7.34时间点恢复数据
    MySQL 如何处理监听连接的
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/11128695.html
Copyright © 2011-2022 走看看