- -数据水吧...0S过
1112: 最少操作数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 36 Solved: 28
[ Submit][ Status][ Web Board]
Description
最近,Dr. Kong 又新设计了一个机器人Bill。这台机器人很聪明,会做许多事情。比如你给它任意一个正整数,它可以按照一定的运算规则, 计算出得到1的最少操作次数。
该运算规则是:
如果n为偶数,将其除以2;
如果n为奇数,可以加1或减1;
然后一直处理下去,直到得到运算结果为1。
现在假如你给定Bill一个正整数m,你认为它会怎么计算出计算出得到1的最少操作次数。
Input
第一行:n 表示有多少组测试数据。
接下来有n行:每一行有一个正整数m(0<m<100000),表示你给定Bill的正整数。
Output
对于每一行测试数据,输出一行,每行数据为最少操作次数。
Sample Input
37155
Sample Output
453
HINT
#include <cstdio>
#include <iostream>
#include <cmath>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
struct fuck
{
int x;
int step;
};
void bfs(int t)
{
queue <fuck> q;
fuck now,next;
now.x=t;
now.step=0;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==1){
cout<<now.step<<endl;
break;
}
if(now.x%2==0)
{
next.x=now.x/2;
next.step=now.step+1;
q.push(next);
}
else {
next.step=now.step+1;
next.x=now.x+1;
q.push(next);
next.x=now.x-1;
q.push(next);
}
}
while(!q.empty())
q.pop();
}
int main()
{
//freopen("input.txt","r",stdin);
int n;
cin>>n;
while(n--)
{
int t;
cin>>t;
bfs(t);
}
return 0;
}