【hdu 5945 】 【dp+单调队列优化】Fxx and game【求数x最少经过多少次变换能变为1,(1)如果x%k==0,那么可以x=x/k。(2)x=x-i,(1<=i<=t)】
来源:互联网 发布:js数组重排序 编辑:程序博客网 时间:2024/05/29 02:01
传送门:http://acm.split.hdu.edu.cn/showproblem.php?pid=5945
描述:
青年理论计算机科学家Fxx给的学生设计了一款数字游戏。一开始你将会得到一个数X,每次游戏将给定两个参数k,t, 任意时刻你可以对你的数执行下面两个步骤之一:1.X=X−i(1<=i<=t)。2.若X为k的倍数,X=X/k。现在Fxx想要你告诉他最少的运行步骤,使X变成1。
思路:
设dp[i]为i变为1的最小步骤,
当i%k==0时 dp[i]=min(dp[i / k],dp[j])+1{i-t<=j<=i-1}
否则 dp[i]=min(dp[j])+1{i-t<=j<=i-1}
min(dp[j])相当于维护区间[i-t,i-1]最小值。如果纯暴力,复杂度会有
代码:
#include <bits/stdc++.h>using namespace std;#define mst(ss,b) memset(ss,b,sizeof(ss));#define rep(i,k,n) for(int i=k;i<=n;i++)const int inf=0x3f3f3f3f;const int N=1e6+10;int deq[N];//单调队列优化,维护下标int dp[N], x, k, t;void solve(){ int l, r; l = r = 1; dp[1] = 0; deq[1] = 1; rep(i, 2, x){ while(l <= r && deq[l] < i - t)l++; //单调队列中最多只能有t个元素 if(l <= r)dp[i] = dp[deq[l]] + 1; if(i % k == 0)dp[i] = min(dp[i], dp[i / k] + 1); while(l <= r && dp[deq[r]] >= dp[i])r--; //保持单调性 deq[++r] = i; }}int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d%d%d", &x, &k, &t); mst(dp, inf); solve(); printf("%d\n", dp[x]); } return 0;}
0 0
- 【hdu 5945 】 【dp+单调队列优化】Fxx and game【求数x最少经过多少次变换能变为1,(1)如果x%k==0,那么可以x=x/k。(2)x=x-i,(1<=i<=t)】
- x^1 + x ^2 +...+x ^n = m 求x
- x=x&(x-1)
- x=x&(x-1)
- x = x&(x-1)
- x = x&(x-1)
- x &= (x-1)
- x&(x-1)=?
- x=x+1、x+=1、x++、++x
- c++ x=x|(x+1); x&(x-1)
- x += i与x=x+i
- 表达式"x=x&(x-1)
- 表达式"x=x&(x-1)"
- 表达式"x=x&(x-1)"
- x=x+1,x+=1,x++的区别
- x=x|(x+1);和x=x&(x-1)?
- Java x=x+(x++)+(++x)分析
- 【HDU 5944】【暴力】Fxx and string 【给定一个字符串s,求有多少个三元组(i,j,k)满足i,j,k是等比数列且s[i]=='y'&&s[j]=='r'&&s[k]=='x'】
- git常用命令
- Linux环境下如何杀死僵尸进程
- 1.html5语义化标签及表单新增控件和特性
- YDB系统JDBC接口访问工具
- Gitlab的来历、功能、使用
- 【hdu 5945 】 【dp+单调队列优化】Fxx and game【求数x最少经过多少次变换能变为1,(1)如果x%k==0,那么可以x=x/k。(2)x=x-i,(1<=i<=t)】
- 数据结构示例之查看链表元素是否存在
- Dynamic Web project Error “Loading descriptor”
- Codeforces 445 A DZY Loves Chessboard(预处理)
- dockerd路由和初始化
- 第九周项目3-稀疏矩阵的三元组表示的实现及应用(2)
- 【poj 1273】Drainage Ditches 最大流dinic模板
- 洛谷 P2409 小Y的积木 (dp)
- 练习:删除内有子内容的目录