HDU 5945 Fxx and game 单调队列优化dp
题目链接
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相关推荐
- hdu 3401 Trade(单调队列优化dp)
hdu 3401 Trade(单调队列优化dp) 题意:lxhgww喜欢炒股票,他可以在第i天买入或者卖出若干张股票(一天只能买或者卖),两个交易日之间至少相隔w天,问他t天后最多能赚多少. 解题思路 ...
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
- poj 2373(单调队列优化dp)
在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...
- poj 1821(单调队列优化dp)
题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)
题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- 【单调队列优化DP】烽火传递 LibreOJ - 10180
题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...
最新文章
- VS2010 定位文件在solution中的位置
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it
- 【转】介绍设置Session失效的几种方法
- MORAN文本识别算法开源,刷新多个OCR数据集state-of-the-art
- 把Python函数转换成能在SQL语句中调用的函数
- K8S 的报错问题解决
- 数据包络分析--两阶段加性网络DEA--使用优化黄金分割比例算法(第二篇)
- python编程软件开发_Python编程-绑定方法、软件开发
- linux sftp连接报错:JSchException: Algorithm negotiation fail问题的解决方法
- 买房? 上区块链, 安排! 全国首张不动产区块链电子凭证诞生
- js中的浅拷贝与深拷贝
- 三国史诗——三国官制(二)
- 直通车点击率、点击率、创意图、关键词、出价卡位,提升直通车点击率的技巧和方法
- 生活,令人满意的生活,丰富的生活包括了起起落落,包括了痛苦和再次振作,包括了失败和再次奋
- 分享一份适合程序员的LaTex版本个人简历
- 通过WIFI唤醒终端设备
- 【GPGPU编程】GPGPU架构剖析之谓词寄存器
- linux 设置开机自启
- Module 模块化
- Microsoft Edge 浏览器设置默认起始页