题解 P1748 【H数】

我来讲讲 \(dp\) 的做法

前言

昨天 \(PHY\) 大佬问我,这题怎么做?考虑到他没学过 \(set\) 、 \(priority_queue\) 和 \(queue\) 。之后,我就想到了可以用 \(dp\) 来解决这道题。

正文

设置状态

很显然,我们可以用 \(f[i]\) 表示第\(i\)个数是多少。

转移

第\(i\)个\(H\)数是多少,我们显然应该从前面的\(i-1\)个数去分别\(\times2\)、\(\times3\)、\(\times5\)、\(\times7\)中取比第\(i-1\)个\(H\)数大的最小数。

边界条件

\(f_1=1\)是很显然的

此外还要注意\(f_0=0\)

代码

我们现在就可以开始写代码了

注意开\(long\) \(long\)

#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
    T RR=1;FF=0;char CH=getchar();
    for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
    for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
    FF*=RR;
}
template<typename T>void write(T x){
    if(x<0)putchar('-'),x*=-1;
    if(x>9)write(x/10);
    putchar(x%10+48);
}
long long f[10010];
int main(){
    memset(f,127,sizeof(f));//为了找最小,我们最开始就得赋成最大
    int n;
    read(n);
    f[0]=0;//初始化
    f[1]=1;//初始化
    for(int i=2;i<=n;i++)
        for(int j=i-1;j>=1;j--)
            if(f[j]*2>f[i-1])f[i]=min(f[i],f[j]*2);
            else if(f[j]*3>f[i-1])f[i]=min(f[i],f[j]*3);
                else if(f[j]*5>f[i-1])f[i]=min(f[i],f[j]*5);
                    else if(f[j]*7>f[i-1])f[i]=min(f[i],f[j]*7);
                        else break;//优化
    write(f[n]);//输出
    return 0;
}

后记

这个代码还是很简短的,十分好写,行为大家以后学习也能好好想想一题多解

最后来求一下赞和评论!

原文地址:https://www.cnblogs.com/zhaohaikun/p/12233992.html

时间: 2024-10-08 16:41:04

题解 P1748 【H数】的相关文章

P1748 H数 题解

原题链接 简要题意: 求第 \(k\) 个质因子只包含 \(2,3,5,7\) 的数.规定 \(1\) 是第一个这样的数. 显然,本题可以用数组实现,用四个指针,将最小的往前进一发. 但是,有 \(\texttt{STL}\) 和 这么弱的数据,我们还需要维护什么? 你发现,需要去重和排序.这不就是 \(\text{set}\) 的标本? 每次取出 \(\text{set}\) 第一个元素 \(x\),并将 \(x \times 2,3,5,7\) 均重新插入集合,同时将答案指针往后移一位. 最

H.数7(模拟)

1212: H.数7 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 5 标签提交统计讨论版 题目描述 数7是一个简单的饭桌游戏,有很多人围成一桌,先从任意一人开始数数,1.2.3……那样数下去,逢到7的倍数(7.14.21……)和含有7的数字(17.27……)必须以敲桌子代替.如果有谁逢7却数出来了,就要接受惩罚.小明觉得这个游戏太简单了,于是对它做出了改进,那就是每逢到素数的时候就以敲桌子代替,并且数数的方向发生改变,而且最开始的那个人可以从1到10000中选一个合数

[NOIP2003]栈 题解(卡特兰数)

[NOIP2003]栈 Description 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作: 1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作) 2.将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作) 使用这两种操作,由一个操作数序列就可以得到一系列的输出序列; 你的程序将对给定的n,计算并输出由操作数序列1,2,-,n经过操作可能得到的输出序列的总数. Solution

[SCOI2010]生成字符串 题解(卡特兰数的扩展)

[SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗? 输入格式:输入数据是一行,包括2个数字n和m; 输出格式:输出数据是一行,包括1个数字,表示满足要求的字符串数目,这个数可能会很大,只需输出这个数除以20100403的余数; Solution 1

[AHOI2012]树屋阶梯 题解(卡特兰数)

[AHOI2012]树屋阶梯 Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为N+1尺(N为正整数)的大树上,正当他发愁怎么爬上去的时候,发现旁边堆满了一些空心四方钢材(如图1.1),经过观察和测量,这些钢材截面的宽和高大小不一,但都是1尺的整数倍,教官命令队员们每人选取N个空心钢材来搭建一个总高度为N尺的阶梯来进入树屋,该阶梯每一步台阶的高度为

[HNOI2009]有趣的数列 题解(卡特兰数)

[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<...<a2n-1,所有的偶数项满足a2<a4<...<a2n: (3)任意相邻的两项a2i-1与a2i(1<=i<=n)满足奇数项小于偶数项,即:a2i-1<a2i. 现在的任务是:对于给定的n,请求出有多少个不同的长度为2n的有趣的数列.

【题解】丑数

题目描述 如果一个数的素因子只包含2,3,5或7,那么我们把这种数叫做丑数.序列1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,  25,27...展示了前20个丑数. 请你编程寻找这个序列中的第n个元素. 输入输出格式 输入格式 一行,为一个整数n.(1≤n≤5842) 输出格式 一行,“The nth humble number is number.”.里面的n由输入中的n值替换,“st”,“nd”,“rd”和“th”这些序数结尾的用法参照输出样例.

[ 题解 ] [ 贪心 ] H. Roma and Changing Signs (待更名)

http://codeforces.com/group/NVaJtLaLjS/contest/236618/problem/H 题意: 给出N个数字,包括正负数:以及数值K. 这个K表示给数字变换符号的次数,必须变换K次,同一个数可以反复翻转正负. 现在输出K次变换后所有数字的最大总和. 示例: Input: 3 2 -1 -1 1 Output: 3 Input: 3 1 -1 -1 1 Output: 1 又是贪心.优先把变换机会给最小的负值,负值会变成很大的整数. 如果负值都变正数后还有变

【题解】删数游戏

题目描述 输入一个高精度的正整数n(≤240位),去掉其中任意s个数字后,剩下的数字按原左右次序组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小. 输入格式 第一行,一个正整数n: 第二行,s(s<n的位数). 输出格式 最后剩下的最小数. 输入样例 175438 4 输出样例 13 题解 容易想到,把当前的数转换成一个数字串,那么这个数字串里如果出现了逆序对,就删除这个逆序对的第一个元素即可.如果不存在逆序对,就删除最后一位即可. #include <ios