标签:
题意:在一条数轴上,一个人想从点n走到点k,他每分钟坐标可以+1或者-1或者×2,问最少多少分钟走到。
解法:一个广搜……不知什么原因的wa了一天……最后重写了一遍才过……
让我想到了某场cf的B题……也是从n走到k,可以+1或者/2,当时傻傻的写了好长的广搜……后来正解是贪心orz
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
bool vis[400010];
struct node
{
int num, step;
node(int num, int step) : num(num), step(step) {}
node() {}
};
queue <node> q;
int main()
{
int n, k;
while(~scanf("%d%d", &n, &k))
{
while(!q.empty())
q.pop();
if(n >= k)
{
printf("%d\n", n - k);
continue;
}
int ans = k - n;
memset(vis, 0, sizeof vis);
q.push(node(n, 0));
vis[n] = true;
while(!q.empty())
{
node tmp = q.front();
q.pop();
if(tmp.num == k)
{
ans = tmp.step;
break;
}
for(int i = 0; i < 3; i++)
{
int ttmp;
switch(i)
{
case 0 : ttmp = tmp.num + 1;break;
case 1 : ttmp = tmp.num - 1;break;
case 2 : ttmp = tmp.num * 2;break;
}
if(ttmp >=0 && ttmp - k + tmp.step + 1 <= ans && !vis[ttmp])
{
vis[ttmp] = true;
q.push(node(ttmp, tmp.step + 1));
}
}
}
printf("%d\n", ans);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/Apro/p/4469022.html