题目:
(1)删数问题
问题描述:给定n位正整数a,去掉其中任意k≤n个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。
输入:
657943148 3
输出:
543148
一道算法课上机题,一直很轻视这种上机题,直接想当然的贪心取前k+1位只取最小值,幸亏后来听别人说了想了下,才知道自己错了。
错误代码:
#include<iostream>
#include<cmath>
using namespace std;
int s[105];
int main()
{
int a,k,b;
cin >> a >> k;
b = a;
int num = 0;//9
while(a > 0)
{
s[num++] = a%10;
a /= 10;
}
int t = (int)(pow(10,num-k-1)+0.5);//
int res = b % t;//
//cout<<res<<endl;
int minn = 105;
for(int i = num-k-1;i < num;i++)
minn = min(minn,s[i]);
//cout<<pow(10,num-k-1)<<endl;
res = minn*t + res;
cout<<res<<endl;
return 0;
}
//657943148 3
正确思路:
每次删除第一个值大于右边一位的值
正确代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
int k;
cin >> a >> k;
while(k--)//删除k次
{
int j = 0;
while(j < a.size()-1 && a[j] < a[j+1])
j++;
a.erase(j,1);
}
cout<<a<<endl;
return 0;
}
//657943148 3
//178906 4
ps:以后各种题目都尽量认真对待吧=。=