题目: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 ",b-a); 27 continue; 28 } 29 printf("%d ",dfs(a,b,0)); 30 } 31 return 0; 32 }