Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 360 Accepted Submission(s): 84

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.

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。

Output

For each test case, output the answer.

Sample Input

2

9 2 1

11 3 3

Sample Output

4

3

Source

BestCoder Round #89

【题解】



f[i] = min(f[i],f[i/k]+1);

f[i] = min(f[i],f[i-t..i-1]+1);

第二行那个转移可用一个单调队列优化;

因为f[i+1]>=f[i];

dl的最左边维护的是i-t..i-1这个区间内f值最小的点的下标;然后往右f值依次递增;

如果新加入的点i,f[i]小于这个dl最右边x对应值f[x],则把x挤掉(那些被挤掉的元素是肯定没有用了的,如果到了某个时刻f[i]被挤掉了,因为i>x,则x肯定也要被挤掉),重复上述步骤;

就能维护一个单调队列;

有点厉害.

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <set>
  4. #include <map>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <queue>
  9. #include <vector>
  10. #include <stack>
  11. #include <string>
  12. #define lson L,m,rt<<1
  13. #define rson m+1,R,rt<<1|1
  14. #define LL long long
  15. using namespace std;
  16. const int MAXN = 2e6;
  17. const int dx[5] = {0,1,-1,0,0};
  18. const int dy[5] = {0,0,0,-1,1};
  19. const double pi = acos(-1.0);
  20. const int INF = 0x3f3f3f3f;
  21. int x,k,t,l,r;
  22. int f[MAXN],dl[MAXN];
  23. void input_LL(LL &r)
  24. {
  25. r = 0;
  26. char t = getchar();
  27. while (!isdigit(t)) t = getchar();
  28. LL sign = 1;
  29. if (t == '-')sign = -1;
  30. while (!isdigit(t)) t = getchar();
  31. while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
  32. r = r*sign;
  33. }
  34. void input_int(int &r)
  35. {
  36. r = 0;
  37. char t = getchar();
  38. while (!isdigit(t)) t = getchar();
  39. int sign = 1;
  40. if (t == '-')sign = -1;
  41. while (!isdigit(t)) t = getchar();
  42. while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
  43. r = r*sign;
  44. }
  45. int main()
  46. {
  47. //freopen("F:\\rush.txt", "r", stdin);
  48. int T;
  49. input_int(T);
  50. while (T--)
  51. {
  52. memset(f,INF,sizeof(f));
  53. input_int(x);input_int(k);input_int(t);
  54. l = 1;r = 1;dl[r] = 1;
  55. f[1] = 0;
  56. for (int i = 2;i <= x;i++)
  57. {
  58. while (l<=r && dl[l]<i-t)l++;
  59. if ((i%k)==0)
  60. f[i] = min(f[i],f[i/k]+1);
  61. if (l <=r)
  62. f[i] = min(f[i],f[dl[l]]+1);
  63. while (l<=r && f[i]<f[dl[r]]) r--;
  64. dl[++r] = i;
  65. }
  66. printf("%d\n",f[x]);
  67. }
  68. return 0;
  69. }

【23.33%】【hdu 5945】Fxx and game的更多相关文章

  1. 【23.33%】【codeforces 557B】Pasha and Tea

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. 【23.33%】【codeforces 664C】International Olympiad

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. 【改革春风吹满地 HDU - 2036 】【计算几何-----利用叉积计算多边形的面积】

    利用叉积计算多边形的面积 我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的 ...

  4. 【23. 合并K个排序链表】【困难】【优先队列/堆排序】

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6] 输出: 1->1-> ...

  5. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. 七夕节 (HDU - 1215) 【简单数论】【找因数】

    七夕节 (HDU - 1215) [简单数论][找因数] 标签: 入门讲座题解 数论 题目描述 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们 ...

  7. 【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间 ...

  8. 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意: 一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在 ...

  9. 【动态规划】【二分】【最长上升子序列】HDU 5773 The All-purpose Zero

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 题目大意: T组数据,n个数(n<=100000),求最长上升子序列长度(0可以替代任何 ...

随机推荐

  1. js中#代表什么

    js中#代表什么 一.总结 1.#号:代表id选择器  2. $('#div1'). : 常用用法,前面也有$符号 二."#"在js中代表什么 js里我不曾看到用到‘#’的代码端, ...

  2. amazeui学习笔记--css(HTML元素2)--代码Code

    amazeui学习笔记--css(HTML元素2)--代码Code 一.总结 1.行内代码:code标签<code> 2.代码片段:pre标签<pre> 3.限制代码块高度:添 ...

  3. Testfan软件测试社区

    1.  http://ask.testfan.cn/article/902  Appium 服务端安装-windows2.  http://ask.testfan.cn/article/1078 最新 ...

  4. 【转】排列组合 "n个球放入m个盒子m"问题 总结

    出处:https://blog.csdn.net/qwb492859377/article/details/50654627 球,盒子都可以分成是否不能区分,和能区分,还能分成是否能有空箱子,所以一共 ...

  5. HibernateCRUD基础框架(3)-简单的和较为复杂的标准的CRUD API

    优点:简单的和基础的CRUD功能可以很快实现,可以说是比较的"标准化".维护起来也很容易. 缺点:性能没有保障.不支持特别复杂的CRUD. 可以适用的场景:小型Web项目 1.Cr ...

  6. java调用C++的过程

    转自https://blog.csdn.net/yjhdxflqm/article/details/50503551 jni是java和C.C++通信的桥梁. java适合写上层的应用,C.C++适合 ...

  7. java中Arrays类的应用

    java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的.具有以下功能: ² 给数组赋值:通过fill方法. ² 对数组排序:通过sort方法,按升序. ² 比较数组:通过equ ...

  8. Android OnGestureListener用法 识别用户手势 左右滑动

    Android可以识别用户的手势(即用户用手指滑动的方向),通过用户不同的手势,从而做出不同的处理 需要使用OnGestureListener 比如说看电子书的时候翻页,或者要滑动一些其他内容 直接上 ...

  9. decode与case when

    语法 decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) select * from reglike; ,),'aaa','yes','no') decode from ...

  10. POJ 2983 Is the Information Reliable? 依旧差分约束

    http://poj.org/problem?id=2983 题目大意: 星际大战开始了.你购买了情报,需要判断它的准确性.已知地方的根据地在由南向北排成一条直线.P A B X,表示A在B北面距离X ...