题目描述
给你一个整数 n,使得从 n 中删除 k 个数字之后的数字最大。
输入
输入一个整数 n (0 <= n <= 10^100),和需要删除数字 k <= 100的个数
输出
输出删除k个数字之后的最大整数
cpp
#include<stdio.h>
#include<string.h>
int main(){
char n[1000];int k,i,t,len;
while(scanf("%s%d",&n,&k)!=EOF){
//while(~scanf("%s%d",&n,&k)){
len=strlen(n);//获取字符串长度
while(k--){
for(i=0;i<len-1;i++) {
if (n[i] < n[i + 1]) {
break;
} //从最高位开始找,找到到高位小于低位的 就跳出
}
while(i+1<len){
n[i]=n[i+1],i++;//通过移位覆盖法删掉应该移除的元素。(之后就相当于要移除最后一个元素)
}
len--;//字符串长度减少 (若应该去除最后一个元素 ,直接 长度减少)
}
n[len]=0;
printf("%s\n",n);
}
return 0;
}
通过贪心的方法: 根据题意, 就是删除k个数字 保持原序列顺序不变的情况 下,使得 剩下的数字组成的最大。 我们一般比较一个数的大小,是怎么比的 ,比如 8999 9000 ,是不是先看最高位, 第一个数最高位为8 第二个数最高位为9,那么后面根本就不用关心。所以一个数大不大 由高位决定。 最高位相同,比次高位,依次类推。因此此题可以按以下步骤解决。 1.从最高位 开始找,找相邻的两个数中,高位的数字小于低位的数字,则应该把 高位的数字删掉, 2.如果是一个原序列是一个递减序列(或者 全为 11111 这种均匀序列),则删除最后一个元素就好了。