[hdu 5945 Fxx and game] dp+单调队列

来源:互联网 发布:常用的机械制图软件 编辑:程序博客网 时间:2024/05/13 07:58

[hdu 5945 Fxx and game] dp+单调队列

题目链接:[hdu 5945 Fxx and game]
题意描述:请看BestCoder中文题面…传松门
青年理论计算机科学家Fxx给的学生设计了一款数字游戏。
一开始你将会得到一个数X,每次游戏将给定两个参数k,t, 任意时刻你可以对你的数执行下面两个步骤之一:

  1. X=Xi(1<=i<=t);
  2. XkX=X/k

现在Fxx想要你告诉他最少的运行步骤,使X变成1
解题思路:用dp[z]表示数z变换到1的最少变换次数。显然有:

dp[z]={min{dp[zi]}+1,min{dp[zi],dp[z/k]}+1,(z%k0)(z%k=0)(,1it).

min{dp[zi]}(1it) 就相当于求区间[zt,z]的区间最小值。纯暴力,复杂度会有O(N2);在这个题目里面, 线段树还是会超时,复杂度为O(Xlog2(X))。如果考虑用单调队列来优化,复杂度为O(N)
单调队列的队首永远是dp最小值。

#include <bits/stdc++.h>using namespace std;int T, X, k, t;const int MAXN = 1e6 + 5;const int INF = 0x3f3f3f3f;queue<int> Q;int dp[MAXN];int main() {//    freopen("E:\\ACM\\input.txt", "r", stdin);    scanf("%d", &T);    while(T --) {        scanf("%d %d %d", &X, &k, &t);        memset(dp, 0x3f, sizeof(dp));        while(!Q.empty()) Q.pop();        dp[1] = 0;        Q.push(1);        for(int z = 1; z <= X; z++) {            while(!Q.empty() && Q.front() < z - t) Q.pop();            if(!Q.empty()) dp[z] = min(dp[z], dp[Q.front()] + 1);            if(z % k == 0) dp[z] = min(dp[z], dp[z / k] + 1);            while(!Q.empty() && dp[Q.front()] >= dp[z]) Q.pop();            Q.push(z);        }        printf("%d\n", dp[X]);    }    return 0;}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乐视手机开不了机怎么办 vivo手机拨号键盘不见了怎么办 华为手机拨号键盘不见了怎么办 金立手机拨号键盘不见了怎么办 酷派手机home键失灵怎么办 r11屏碎一半黑屏怎么办 金立手机黑屏打不开怎么办 小米8se自动跳出广告怎么办 小米手机总跳出广告怎么办 小米手机总是出现广告怎么办 红米1s开机黑屏怎么办 红米手机打电话黑屏怎么办 小米4c打游戏卡怎么办 电脑总出现拨号连接怎么办 win10电脑没有拨号连接怎么办 红米手机黑屏了怎么办 小米4s黑屏了怎么办 鼠标的左键失灵怎么办 小米5左键失灵怎么办 小米4左键失灵怎么办 小米5s左键失灵怎么办 单击鼠标左键就会自动删除?怎么办 华为五s开不开机怎么办 荣耀8关不了机怎么办 三星s7左键失灵怎么办 华为mate7死机黑屏了怎么办 小米手机max黑屏打不开怎么办 小米max开不了机怎么办 小米6接听电话声音小怎么办 小米手机接听电话声音小怎么办 小米5听筒声音小怎么办 红米手机不能开机怎么办 小米5x升级失败怎么办 安卓手机打电话黑屏怎么办 来电话就出黑屏怎么办 oppo手机停留在开机界面怎么办 小米4c死机了怎么办 苹果手机拨打电话时黑屏怎么办 华为畅享6黑屏怎么办 手机拨号键盘变小了怎么办 小米5s手机黑屏打不开怎么办