HDU-5945 Fxx and game (BFS)

来源:互联网 发布:数据归一化处理方法 编辑:程序博客网 时间:2024/05/22 04:35

Fxx and game

Accepts: 74

Submissions: 1857

Time Limit: 3000/1500 MS (Java/Others)

Memory Limit: 131072/65536 K (Java/Others)

问题描述
青年理论计算机科学家Fxx给的学生设计了一款数字游戏。

一开始你将会得到一个数X,每次游戏将给定两个参数k,t, 任意时刻你可以对你的数执行下面两个步骤之一:

1.X=X−i(1<=i<=t)

2.2.若X为k的倍数,X=X/k。

现在Fxx想要你告诉他最少的运行步骤,使X变成11。

输入描述
第一行一个整数T(1≤T≤20)表示数据组数。

接下来T行,每行三个数X,k,t(<=1e6)

​​)

数据保证有解。

输出描述
输出共T行。

每行一个整数表示答案。

输入样例
2
9 2 1
11 3 3

输出样例
4
3
题解:比赛的时候无脑dp+线段树维护。。。后来想了想其实就一个bfs。每一次把所有未出现过的可行解压入队列。
代码:

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <queue>#include <stack>#include <map>#include <algorithm>#include <string.h>#include <vector>#define bababaa printf("!!!!!!!\n")using namespace std;const int N=1e6+10;struct node{int pos,val;}p;int vis[N];int bfs(int x,int k,int t){    if(k==1&&t)        return (x+t-2)/t;   for(int i=1;i<=x;i++)    vis[i]=0;    queue<node>q;    q.push((node){x,0});    vis[x]=1;    while(!q.empty())    {        p=q.front();        q.pop();        if(p.pos==1)            return p.val;        if(p.pos%k==0&&!vis[p.pos/k])        {            q.push((node){p.pos/k,p.val+1});            vis[p.pos/k]=1;        }        int mi=min(t,p.pos-1);        for(int i=mi;i>=1;i--)        {            if(!vis[p.pos-i])            {                q.push((node){p.pos-i,p.val+1});                vis[p.pos-i]=1;            }            else                break;//这个剪枝很重要        }    }}int main(){    int T,x,k,t;    scanf("%d",&T);    while(T--)    {        scanf("%d%d%d",&x,&k,&t);        printf("%d\n",bfs(x,k,t));    }}
0 0