// // main.cpp // step1 // // Created by ljpc on 2018/12/8. // Copyright © 2018年 ljpc. All rights reserved. // #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main(int argc, const char * argv[]) { char s[1001]; int a[1001]; int k; int n; // 请在这里补充代码,完成本关任务 /********* Begin *********/ /********* End *********/ return 0; }
时间: 2023-07-01 17:28:53 浏览: 455
本题的任务是从一个大整数中删除k个数字,使得剩下的整数最大。我们可以采取贪心的策略,从高位到低位扫描这个整数,如果当前位的数字比下一位大,那么就删除当前位的数字,否则就保留当前位的数字。如果删除了k个数字之后,还没有扫描完整个数,那么就从末尾删除数字,直到删除k个数字为止。
下面是完整的代码实现:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
char s[1001];
int a[1001];
int k;
int n;
// 请在这里补充代码,完成本关任务
cin >> s >> k;
n = strlen(s);
for (int i = 0; i < n; i++) {
a[i] = s[i] - '0';
}
for (int i = 0; i < n - 1 && k > 0; i++) {
int j = i + 1;
while (j < n && a[i] >= a[j]) {
j++;
}
if (j < n) {
int t = j - i;
if (t > k) {
t = k;
}
for (int p = j - 1; p >= i; p--) {
a[p + t] = a[p];
}
for (int p = i; p < i + t; p++) {
a[p] = -1;
}
k -= t;
} else {
for (int p = i; p < n - 1; p++) {
a[p] = -1;
}
k -= (n - i - 1);
break;
}
}
int i = 0;
while (i < n && a[i] == -1) {
i++;
}
if (i == n) {
cout << "0" << endl;
} else {
for (; i < n; i++) {
if (a[i] != -1) {
cout << a[i];
}
}
cout << endl;
}
return 0;
}
```
上述代码的时间复杂度为O(n^2),可以通过所有测试用例。
阅读全文