OJ3RD 1181 删数问题 - 贪心算法
来源:互联网 发布:单片机模块化编程 编辑:程序博客网 时间:2024/05/21 18:47
链接:http://acm.buaa.edu.cn/problem/1181/
之前怎么也搞不明白错在哪了,结果发现居然是一个条件打错了....... 泪崩T^T给定n位数要求删除s个数,问最大的结果,要求首位不能为0.
贪心法则:因为高位更重要所以从左往右找,
第一位比较特殊,因为不能是零,往后找s个数求其中不为0的最小值,如果比第一位还要小就删到让那个最小值代替第一位;
只要s不为零就往后找,判断类似第一位,只是后面的位允许最小值为0
两个特例:找到最后一位s仍旧不为0,那么就把最后s位删除
s==n-1 也就是删完后变成个位数.. 题目里没说可否为0,我的理解是可以,那么直接找全数位的最小值
#include<iostream>#include<cstdio>#include<string>using namespace std;int n, s;int main(){ while (~scanf("%d %d", &n, &s)) { string str; cin >> str; if (n == s + 1) { int min = 9; for (int i = 0; i < n; i++) min = min < (str[i] - 48) ? min : (str[i] - 48); printf("%d", min); } else { if (str[0] - 48 > 1) { int min = 9, idspan; for (int i = 1; i <= s; i++) if ((str[i] - 48 != 0) && (min > str[i] - 48)) { min = str[i] - 48; idspan = i; if (min == 1) break; } if (min < str[0] - 48) { s -= idspan; str.erase(0, idspan); } } for (int i = 1; i <= str.length() - 2; i++) { if (s == 0) break; else { if (str[i] - 48 >= 1) { int min = 9, idspan; for (int j = 1; j <= s && i + j <= str.length() - 1; j++) if (min > str[i + j] - 48) { min = str[i + j] - 48; idspan = j; if (min == 0) break; } if (min < str[i] - 48) { s -= idspan; str.erase(i, idspan); } } } } if (s > 0) str.erase(str.length() - s, s); cout << str << endl; } } return 0;}
0 0
- OJ3RD 1181 删数问题 - 贪心算法
- OJ3RD 1132 哈弗曼编码 - 贪心算法&哈夫曼树
- 贪心算法 - 删数问题
- 贪心算法-删数问题
- 贪心算法---删数问题
- 贪心算法,删数问题
- 贪心算法 - 删数问题
- 算法:(贪心算法)--删数问题
- 问题 A: [贪心算法]删数问题
- 贪心算法之删数问题
- 贪心算法—删数问题
- 【贪心算法初学】删数问题
- 贪心算法之删数问题
- 贪心算法例题:2072删数问题
- C++贪心算法之删数问题
- C++ 之 贪心算法 ( 删数问题 )
- 贪心算法——删数问题
- SDUT 贪心算法 删数问题
- compress_archive
- SpaceX创造历史:完成人类首次太空火箭软着陆
- Makefile的origin 函数
- Environment
- Jetty 的工作原理以及与 Tomcat 的比较
- OJ3RD 1181 删数问题 - 贪心算法
- Maven聚合和继承
- java 中的 wait()方法和 sleep()方法的区别
- LCD驱动分析(一):时序的分析
- 文章标题
- Redis1
- 被中二病拯救 ——看《中二病也要谈恋爱》第一季
- jsp综合应用之标准化考试
- OJ3RD 1120 已经没有什么好怕的了 - 贪心算法