UVA - 11491 Erasing and Winning 贪心
2015-04-16 15:16
387 查看
题目大意:给出一个n位数的数字,要求你删掉m位,使得最后的n-m位数达到最大
解题思路:贪心策略,肯定是最高位越大越好了。刚开始的思路是这样的,从前往后扫描,找到比当前位大的数,找到后,再往后继续扫描,看有没有比这个数更大的数,这样明显会超时的。
换种思路,什么情况下不用删除数字了,肯定是这个数的所有位是降序排序的时候,所以,我们改变策略,从后往前扫描,并标记,记录前一位的值,这样需要扫描的次数就会大大降低了
解题思路:贪心策略,肯定是最高位越大越好了。刚开始的思路是这样的,从前往后扫描,找到比当前位大的数,找到后,再往后继续扫描,看有没有比这个数更大的数,这样明显会超时的。
换种思路,什么情况下不用删除数字了,肯定是这个数的所有位是降序排序的时候,所以,我们改变策略,从后往前扫描,并标记,记录前一位的值,这样需要扫描的次数就会大大降低了
[code]#include<cstdio> #include<cstring> #define maxn 100010 int mark[maxn]; char str[maxn]; int main() { int n, m; while(scanf("%d%d", &n, &m) == 2 && n + m) { scanf("%s", str); memset(mark,0,sizeof(mark)); int cnt = 0; int pre = str[0], pre_pos = 0; for(int i = 1; i < n; i++) { if(!mark[i]) { if(str[i] > pre) { for(int j = i - 1; j >= 0; j--) { if(!mark[j] && str[j] < str[i] && cnt < m) { mark[j] = 1; cnt++; } if(!mark[j] && str[j] >= str[i]) break; } } pre = str[i], pre_pos = i; } } if(cnt < m) { for(int i = n - 1; i >= 0 && cnt < m; i--) if(!mark[i]) { mark[i] = 1; cnt++; } } for(int i = 0; i < n; i++) if(!mark[i]) printf("%c", str[i]); printf("\n"); } return 0; }
相关文章推荐
- UVA 11491 Erasing and Winning(贪心)
- uva 11491 Erasing and Winning 奖品的价值(贪心)
- UVa 11491 Erasing and Winning (贪心,单调队列或暴力)
- (贪心+栈)UVa 11491 Erasing and Winning
- UVA 11491 Erasing and Winning 奖品的价值 (贪心)
- Uva 11491 Erasing and Winning(贪心)
- UVa 11491 - Erasing and Winning(贪心)
- UVA - 11491 Erasing and Winning
- 从一个n位数中选出m位按顺序组成新数并使其最大 || Erasing and Winning UVA - 11491
- uva 11491 - Erasing and Winning
- UVa 11491 - Erasing and Winning ( 优先队列模拟 )
- uva 11491 - Erasing and Winning【优先队列模拟】
- 【习题 8-4 UVA - 11491】Erasing and Winning
- UVa11491- Erasing andWinning(从一题看多解)
- Uva - 11491 - Erasing and Winning
- UVA-11491 Erasing and Winning (单调队列)
- uva 11491——Erasing and Winning
- Uva - 11491 - Erasing and Winning
- 11491 - Erasing and Winning(贪心)
- 【思路、优化】UVa 11491 - Erasing and Winning