关于删数问题
原题来源于洛谷:P1106 删数问题
键盘输入一个高精度的正整数 N(不超过 250 位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N和 k,寻找一种方案使得剩下的数字组成的新数最小。
分析:运用一种贪心:从下标0开始遍历整个整数字符串,如果第i个数比第i+1个数大,那么删去第i个数。然后重新从下标0开始遍历字符串,继续以此类推。
注意:可能出现数字一直递增的情况,所以要在代码结尾判断一下,若删除的个数不够则重新从字符串结尾删除数字,直到删除的个数足够。
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
const int maxv=1001000;
const int mod=100000;
void solve(int num){
}
int main()
{
int num;
string str;
char strChar[300];
//getline(cin,str); //洛谷的getline有问题,不推荐使用。
scanf("%s",strChar);
str=strChar;
scanf("%d",&num);
int len=str.size();
while(num>0){
int pos=num;
for(int i=0;i<str.size()-1;i++){
if(str[i]>str[i+1]){
str.erase(str.begin()+i);
num--;
i--;
break;
}
}
if(!num){
while(str[0]=='0'&&str.size()!=1) str.erase(str.begin());
printf("%s",str.c_str());
return 0;
}
if(pos==num) break; //若num前后无变化,则说明整个字符串是递增字符串。
}
for(int i=0;i<num;i++) str.erase(str.end()-1);
while(str[0]=='0'&&str.size()!=1) str.erase(str.begin());
printf("%s",str.c_str());
return 0;
}
代码如上,欢迎讨论。