UVa 11491 Erasing and Winning

题意:给出一个n位的整数,要求删除其中的d个数字,使得剩下的部分最大化。

有简单的做法,我们可以注意到,高位对一个数字的是有绝对的影响力的,所以我们需要保证高位足够大,我们可以这样贪心求解,我们对这n个数字从前往后考虑:

若后一个数字比前一个数字大,则前面这个数字肯定需要删除,并且删除之后我们还得和新的前一个数字比较,如果仍然是后一个数字大我们还得将这个新的前一个数字删除并继续这样比较下去,直到比较到最前面或者前一个数字大于等于后一个数字。

若后一个数字小于等于前一个数字,我们就继续往下比较。

按照这种规则,当我们删除d个数字之后就可以直接得出最后的结果。

代码就可以写的很简短:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 100000;
 5 char str[maxn];
 6 
 7 int main(){
 8 #ifdef TEST
 9     freopen("out.txt", "w", stdout);
10     freopen("in.txt", "r", stdin);
11 #endif // TEST
12     int n, d;
13     while(scanf("%d%d", &n, &d) == 2 && n){
14         getchar();
15         char ch;
16         int cnt = 0, td = d;
17         while((ch=getchar())!='\n'){
18             if(cnt == 0 || td == 0) str[cnt++] = ch;
19             else {
20                 int t = cnt - 1;
21                 while(t >= 0 && td > 0 && ch > str[t]) {
22                     t--;
23                     td--;
24                 }
25                 str[t+1] = ch;
26                 cnt = t+2;
27             }
28         }
29         str[n-d] = '\0';
30         puts(str);
31     }
32     return 0;
33 }
View Code

猜你喜欢

转载自www.cnblogs.com/DynastySun/p/9349026.html
今日推荐