Fxx and game
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 347 Accepted Submission(s): 78
Problem Description
Young theoretical computer scientist Fxx designed a game for his students.
In each game, you will get three integers X,k,t
.In each step, you can only do one of the following moves:
1.X=X−i(0<=i<=t)
.
2.
if k|X,X=X/k
.
Now Fxx wants you to tell him the minimum steps to make X
become 1.
In each game, you will get three integers X,k,t
1.X=X−i(0<=i<=t)
2.
Now Fxx wants you to tell him the minimum steps to make X
Input
In the first line, there is an integer T(1≤T≤20)
indicating the number of test cases.
As for the following T
lines, each line contains three integers X,k,t(0≤t≤10
6
,1≤X,k≤10
6
)![]()
For each text case,we assure that it's possible to make X
become 1。
As for the following T
For each text case,we assure that it's possible to make X
Output
For each test case, output the answer.
Sample Input
2
9 2 1
11 3 3
Sample Output
4
3
dp方程还是比较好推的,关键使用单调队列进行优化。
#include <map> #include <set> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <iostream> #include <stack> #include <cmath> #include <string> #include <vector> #include <cstdlib> //#include <bits/stdc++.h> //#define LOACL #define space " " using namespace std; typedef long long LL; //typedef __int64 Int; typedef pair<int, int> paii; const int INF = 0x3f3f3f3f; const double ESP = 1e-5; const double PI = acos(-1.0); const LL MOD = 1e9 + 7; const int MAXN = 1e6 + 10; int dp[MAXN], que[MAXN], loc[MAXN]; int X, k, t; int main() { int T; scanf("%d", &T); while (T--) { scanf("%d%d%d", &X, &k, &t); dp[1] = 0; dp[0] = INF; int tail = 1, head = 1; que[head] = 0; loc[head] = 1; for (int i = 2; i <= X; i++) { dp[i] = INF; if (i%k == 0) dp[i] = dp[i/k] + 1; //找出队顶 while (head <= tail && i - t > loc[head]) head++; dp[i] = min(dp[i], que[head] + 1); //新元素加入到队列 while (head <= tail && dp[i] < que[tail]) tail--; que[++tail] = dp[i]; loc[tail] = i; } printf("%d ", dp[X]); } return 0; }