HDU 5802 Windows 10

题目:Windows 10

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5802

题意:给出p、q两个数,目标是将p变成q,初始x=1,每次可进行的操作有3种:· p=p+1,x=1 、· p=p-x,x=x*2 、· x=1 ,问最少多少操作数可以使p变成q。注意:p不会变成负数,如果-x 会小与0,则变为0。

思路:

  贪心+dfs

  每次可将p 通过-x 的操作变成以下两种:

  1. 大于q的最小数,接下来的操作肯定是 p+1,x=1 或 p=p,x=1,我们可以都选择为不加,等p小于q时,再算回来。

  2. 小于q的最大数,假设这时候p为3,q为10,而前面进行了2次的x=1操作,那么这时候前面那2次x=1操作就可以改为p=p+1,x=1,那么p此时就变成5,只需要再加5次就可以到达q。

AC代码:

 1 #include<stdio.h>
 2 int min(int x,int y)
 3 {
 4   return x<y?x:y;
 5 }
 6 int max(int x,int y)
 7 {
 8   return x<y?y:x;
 9 }
10 int dfs(int a,int b,int stop)
11 {
12   int k = 0;
13   while(a - (1<<k) + 1 > b) k++;
14   if(a - (1<<k) + 1 == b ) return k;
15   return min( k+ max(0 , b - max(0 , (a - (1<<k) +1)) -stop) , k+dfs(a - (1<<k-1) +1,b,stop+1) );
16 }
17 int main()
18 {
19   int t,a,b;
20   scanf("%d",&t);
21   while(t--)
22   {
23     scanf("%d%d",&a,&b);
24     if(b>=a)
25     {
26       printf("%d\n",b-a);
27       continue;
28     }
29     printf("%d\n",dfs(a,b,0));
30   }
31   return 0;
32 }

 

posted @ 2016-08-05 16:14  hchlqlz  阅读(244)  评论(0编辑  收藏  举报