Fxx and game
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 413 Accepted Submission(s): 100
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 .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.
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≤106,1≤X,k≤106)
For each text case,we assure that it's possible to make X become 1。
As for the following T lines, each line contains three integers X,k,t(0≤t≤106,1≤X,k≤106)
For each text case,we assure that it's possible to make X become 1。
Output
For each test case, output the answer.
Sample Input
2 9 2 1 11 3 3
Sample Output
4 3
Source
#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\n", dp[X]);
}
return 0;
}