UVa 11491 - Erasing and Winning

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2486

 

题意:

你是一个电视节目的获奖嘉宾。主持人在黑板上写出一个n位整数(不以0开头),邀请你删除其中的d个数字,
剩下的整数便是你所得到的奖品的价值。当然,你希望这个奖品价值尽量大。1≤d<n≤1e5。

 

分析:

对于一个数abcd,设a<b,现在要删除一位数字。
若不删除a,则这个数是以a开头的,若删除了a,则这个数是以b开头的。
可见前者比后者小,故必然要删除a,其他数位的情况类似。
由于添加和删除都在表的最右端,用一个栈来实现即可。

 

代码:

 1 #include <cstdio>
 2 
 3 const int UP = 1e5 + 5;
 4 char s[UP], stk[UP]; //
 5 
 6 int main(){
 7     int n, d;
 8     while(scanf("%d%d", &n, &d) && n){
 9         scanf("%s", s);
10 
11         int top = 0; //栈顶指针
12         for(int i = 0; i < n; i++){
13             while(d && top && stk[top] < s[i]) d--, top--;
14             stk[++top] = s[i];
15         }
16         top -= d;
17         stk[++top] = '\0';
18         printf("%s\n", stk + 1);
19     }
20     return 0;
21 }

 

转载于:https://www.cnblogs.com/hkxy125/p/8325458.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值