题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=5945

题目

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

题意

给定X,k,t,有两种操作:
1.X=X-i(0<=i<=t)
2.if k|X,X=X/k。
求最少经过多少次操作能将X变成1.

解题

设dp[i]表示将i变成1需要的最少操作次数。
那么,dp[i]=min{dp[i*k],dp[i+j]+1},0<=j<=t.
如果直接按照状态转移方程去写,时间复杂度是O(n^2).
需要用更快的方法求出min{dp[i+j]},0<=j<=t.
而求一个滑动窗口的最小值显然是单调队列的拿手好戏。
维护一个单调上升的队列即可。

这题是在别人博客里看到的,直接莽了一发。死活过不了样例。吃完饭回来去hdu重新读题发现数据有个T组。真的是……被自己蠢哭了,orz.

注意如果是从dp[X]往dp[1]转移,需要注意i*k的时候可能会爆int。然后就会RE。

AC代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;const int maxn=1e6+7;
int X,k,t;
int que[maxn];
int dp[maxn];int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d%d",&X,&k,&t);int L=1,R=0;memset(dp,0x3f,sizeof(dp));dp[X]=0;que[++R]=X;for(int i=X-1; i>=1; i--){while(L<=R && que[L]>i+t) L++;if(L<=R) dp[i]=dp[que[L]]+1;//注意用long long防止REif((ll)i*k<=(ll)X) dp[i]=min(dp[i],dp[i*k]+1);while(L<=R && dp[que[R]]>=dp[i]) R--;que[++R]=i;}printf("%d\n",dp[1]);}return 0;
}

HDU 5945 Fxx and game 单调队列优化dp相关推荐

  1. hdu 3401 Trade(单调队列优化dp)

    hdu 3401 Trade(单调队列优化dp) 题意:lxhgww喜欢炒股票,他可以在第i天买入或者卖出若干张股票(一天只能买或者卖),两个交易日之间至少相隔w天,问他t天后最多能赚多少. 解题思路 ...

  2. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  3. poj 2373(单调队列优化dp)

    在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...

  4. poj 1821(单调队列优化dp)

    题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...

  5. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  6. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)

    题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...

  7. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  8. POJ 1821 Fence(单调队列优化DP)

    题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...

  9. 【单调队列优化DP】烽火传递 LibreOJ - 10180

    题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...

最新文章

  1. VS2010 定位文件在solution中的位置
  2. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it
  3. 【转】介绍设置Session失效的几种方法
  4. MORAN文本识别算法开源,刷新多个OCR数据集state-of-the-art
  5. 把Python函数转换成能在SQL语句中调用的函数
  6. K8S 的报错问题解决
  7. 数据包络分析--两阶段加性网络DEA--使用优化黄金分割比例算法(第二篇)
  8. python编程软件开发_Python编程-绑定方法、软件开发
  9. linux sftp连接报错:JSchException: Algorithm negotiation fail问题的解决方法
  10. 买房? 上区块链, 安排! 全国首张不动产区块链电子凭证诞生
  11. js中的浅拷贝与深拷贝
  12. 三国史诗——三国官制(二)
  13. 直通车点击率、点击率、创意图、关键词、出价卡位,提升直通车点击率的技巧和方法
  14. 生活,令人满意的生活,丰富的生活包括了起起落落,包括了痛苦和再次振作,包括了失败和再次奋
  15. 分享一份适合程序员的LaTex版本个人简历
  16. 通过WIFI唤醒终端设备
  17. 【GPGPU编程】GPGPU架构剖析之谓词寄存器
  18. linux 设置开机自启
  19. Module 模块化
  20. Microsoft Edge 浏览器设置默认起始页

热门文章

  1. php for循环语句的几种用法分析
  2. Linux驱动开发—内核I2C驱动详解
  3. mysql 连接没有释放
  4. 中国象棋程序coony word软件下载
  5. 中国大学mooc网页版获取字幕方法
  6. SMC电缸 LECPA控制模式修改
  7. Golang中获取中文字符串的子串字符位置及截取子串
  8. linux服务器安全-软件包安装
  9. 恶意代码分析-工具收集
  10. 很好用的chrome 插件合集,不要错过