首页 > 代码库 > NYOJ448_寻找最大数【贪心】
NYOJ448_寻找最大数【贪心】
寻找最大数
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
比如当n=92081346718538,m=10时,则新的最大数是9888
输入
第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
样例输入
2
92081346718538 10
1008908 5
样例输出
9888
98
来源
第六届itat复赛B卷2题改编
上传者
ACM_赵铭浩
题目大意:……删去m位数,输出剩余的数字 使新数最大
思路:贪心思想。设位数为len,删去m位数,输出新数,就是输出新数为len-m位
根据贪心思想。从最高位开始,每次保证取出来的数字都是最优的。
比如说7位数,删去3位数。应该从第一位到第len-2位上取最大值。这样首先保证最高位
千位上的结果正确。再从刚才找到值的下一位开始到第len-1位上取最大值。保证百位上
的结果正确。再从刚才找到值的下一位开始到第len位上取最大值,保证各位上结果正确。
比如:9456973 4
因为要删去4个数,所以输出新数为3位。
从第一位9开始到第7-2=5位,找到千位上的最大值,并且尽可能靠左。找到第一位上的
第一个9,则千位为9。再从第二位4开始到第7-1位,找到百位上的最大值,找到第5位上
的第二个9。再从第6位开始到第7位,找到个位上的最大值,找到第6位上的7。
则输出结果为997.
#include<stdio.h> #include<string.h> char ch[110]; int main() { int T,num; scanf("%d",&T); while(T--) { memset(ch,0,sizeof(ch)); getchar(); scanf("%s %d",ch,&num); int len = strlen(ch); num = len - num; int pos = 0; while(num > 0) { int max = -1; int j; for(j = pos; j <= len-num; j++) { if(ch[j]-'0' > max && ch[j]!='a') { max = ch[j]-'0'; pos = j; } } printf("%c",ch[pos]); ch[pos] = 'a'; num--; } printf("\n"); } return 0; }
NYOJ448_寻找最大数【贪心】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。