51nod 减减数1425

news/2024/11/29 14:38:30/

题意:

1425 减减数
1.0 秒 131,072.0 KB 80 分 5级题
初始给定一个整数n。每次可以对其做一个操作,这个操作是将n减去他其中的某一位。得到新的一个数字n’,然后继续操作,直到他变成0为止。

比如24这个例子,24 → 20 → 18 → 10 → 9 → 0

输入
单组测试数据。
第一行有一个整数n(0 ≤ n ≤ 10^12)
输出
输出一个整数表示使得n变成0最少的操作步数。.
输入样例
24
输出样例
5

思路:

1.我的想法:

首先,我们可以先看一下最朴素的算法,那么就是每次都进行分解数字,然后选择最大的数,删掉删掉,很明显n是1e12的范围,不能说一定会T掉,大概率会T掉。。。

然后就要想办法了,首先,我们应该明确肯定每次要减掉最大的,而且前面高位的最大值会对后面低位造成影响。比如1911,百位上的9会对十位上的1和个位上的1造成影响。

我是在哪里出错了呢,当然就是剩下的部分的处理出错了

2.我的想法

我本来是想搜索来着,但是是正着搜索,但是题目要求是这个操作是将n减去他其中的某一位。 但是好像判断有点困难,也不太行

3.正解:

没想到的就是真正解法就是倒着来搜索记忆化搜索

dfs(n , mx)表示当前要处理的数是n,mx是比n的最高位还要高的位的最大值

返回值是pair<long long , long long>类型的,first代表操作次数,second代表将该部分变为0中多余的部分。

记忆化搜索

代码实现:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<math.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int maxn = 2e5 + 5;ll n;
map<pii,pii>mp;pii dfs(ll n,ll mx){//n表示的当前需要处理的数,mx是比n的最高位还要高的位的最大值//返回值为pair类型,first表示操作次数,second表示将该部分变为0的过程中多余的部分if(mp[make_pair(n,mx)].first) return mp[make_pair(n,mx)];if(n < 10) return make_pair((n > 0)||(mx > 0),max(n,mx) - n);ll m = 1;while(m <= n / 10) m = m * 10;ll p = n / m;m = m * p;pii a = dfs(n - m,max(p,mx)),b = dfs(m - a.second,mx);return mp[make_pair(n,mx)] = make_pair(a.first + b.first,b.second);
}int main(){scanf("%lld",&n);printf("%lld\n",dfs(n,0).first);return 0;
}

http://www.ppmy.cn/news/234448.html

相关文章

1425:质数和

1425:质数和 描述 有一个ab位的正整数&#xff0c;前a位是质数&#xff0c;后b位也是质数&#xff0c;求所有符合条件的数字和。 注意&#xff1a;前a位的质数不可以0开头&#xff0c;否则拼出的数字不是ab位。后b位的质数可以是0开头。例如当a1&#xff0c;b2时&#xff0c;2…

P1425 小鱼的游泳时间 题解

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

hdoj1425

题目大意&#xff1a; 如题所述 解题思路&#xff1a; 用空间换时间&#xff0c;定义一个大数组&#xff0c;然后输出即可 代码如下&#xff1a; #include <stdio.h> #include <string.h> #define MAX 1000002 int data[MAX]; int main(void) { int m,n,…

HDU1425

传送门&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1425 排序一下输出前n个&#xff0c;最后一个数后面有空格会报错&#xff01; #include<iostream> #include<algorithm> #define Max 10000005 using namespace std; int arr[Max]; int main() {i…

HDU - 1425 sort

OJ地址&#xff1a;https://vjudge.net/problem/HDU-1425 给你n个整数&#xff0c;请按从大到小的顺序输出其中前m大的数。 Input 每组测试数据有两行&#xff0c;第一行有两个数n,m(0<n,m<1000000)&#xff0c;第二行包含n个各不相同&#xff0c;且都处于区间[-50000…

算法复杂度 hdu1425

算法复杂度 hdu1425 1.算法复杂度分为两个方面&#xff1a; 时间复杂度&#xff1a;程序执行的时间 空间复杂度&#xff1a;程序占用的内存空间 2.TLE&#xff08;Time Limit Exceeded的缩写&#xff09;是时间超限的意思 3.clock()函数可以记录运行时间 4.hdu1425三种方法…

HDU1425 sort【排序】

sort Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 53698 Accepted Submission(s): 15118 Problem Description 给你n个整数&#xff0c;请按从大到小的顺序输出其中前m大的数。 Input 每组测试数据有两行&a…

洛谷1425

#include<iostream> #include<cstdio> using namespace std; int a,b,c,d,e,f,g; int main() { cin>>a>>b>>c>>d; ea*60b; fc*60d; gf-e; cout<<g/60<<" "<<g%60; return 0; }