有一个长度为n(n <= 240)的正整数,从中取出k(k < n)个数,使剩余的数保持原来的次序不变,求这个正整数经过删数之后最小是多少。
输入格式:
n和k
输出格式:
一个数字,表示这个正整数经过删数之后的最小值。
输入样例:
178543 4
结尾无空行
输出样例:
13
结尾无空行
- 知识点:贪心问题,
思路:
- 贪心问题,首先数据用string进行存储,要想得到最小数,首先高位数应该小这样得到的数才会比较小,因此我们就可以判断
if (s[i - 1] > s[i]) {
for (int j = i;j < s.size();j++) {
s[j - 1] = s[j];
}
}
-
也就是将s[i-1]删去.之后我们再从刚开始位置的前一个在进行比较所以
i=i-2
因为for循环里的i要进行++,最终删除k个数后就得到了最小值。自我纠正:哎,这道题真的给我搞吐了,本来是很简单的一道题,结果硬生生修改了无数遍,刚开始我是想删除s中的最大值删除k个就完事了,可是并不是,试想一下如果s=13289
,k=1,按照之前的方法结果是1328,其实答案是1289。所以我们想得到最小值就要先将高位数减小即
if (s[i - 1] > s[i]) {
for (int j = i;j < s.size();j++) {
s[j - 1] = s[j];
}
}
哎这道题就到此结束吧,不想回忆了。
源码:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
int k;
cin >> s >> k;
int t = k;
if (s.size() == k) {
cout << "0";
return 0;
}
for (int i = 1;i < s.size()&&k>0;i++) {
if (s[i - 1] > s[i]) {
for (int j = i;j < s.size();j++) {
s[j - 1] = s[j];
}
k--;
i -=2;
if (i < 1)
i = 1;
}
}
for (int i = 0;i < s.size() - t;i++) {
cout << s[i];
}
}