B

来源:互联网 发布:飞利浦shp8000 知乎 编辑:程序博客网 时间:2024/04/30 03:33
Young theoretical computer scientist Fxx designed a game for his students.

In each game, you will get three integers X,k,tX,k,t.In each step, you can only do one of the following moves:

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

2.2.ifk|X,X=X/kk|X,X=X/k.

Now Fxx wants you to tell him the minimum steps to make XX become 1.
Input
In the first line, there is an integer T(1T20)T(1≤T≤20) indicating the number of test cases.

As for the following TT lines, each line contains three integers X,k,t(0t106,1X,k106)X,k,t(0≤t≤106,1≤X,k≤106)

For each text case,we assure that it's possible to make XX become 1。
Output
For each test case, output the answer.
Sample Input
29 2 111 3 3
Sample Output

43


#include <iostream>#include <algorithm>#include <stdio.h>#include <cstring>#include <cmath>#include <queue>#include <set>#include <bitset>using namespace std;typedef long long LL;int dp[1000005], a[1000005];int pre, tail;int main(){int T, x, k, t;cin >> T;while (T--){scanf("%d%d%d", &x, &k, &t);pre = 0, tail = 0;a[tail++] = x;dp[x] = 0;for (int i = x - 1; i >= 1; i--){dp[i] = (t != 0) ? dp[a[pre]] + 1 : 9999999;if ((1LL * i*k) <= (LL)x) dp[i] = min(dp[i], dp[i*k] + 1);if (a[pre] - t == i) pre++;while (dp[a[tail - 1]] >= dp[i] && tail>pre) tail--;a[tail++] = i;}printf("%d\n", dp[1]);}return 0;}
不知道为什么这样类似暴力都能过,而用单增队列却A不了。路过的大牛解释一下吧

原创粉丝点击