贪心算法入门
1.定义
2.例题
挑一道典型的来说;
题目描述
输入一个高精度的正整数n(≤240位),去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。 (仔细思考,这道题并不是很水)
输入格式
两行,每行一个整数: n(n为小于240位的整数) s
输出格式
最后剩下的最小数。
样例数据
input
178543
4
output
13
数据规模与约定
时间限制:1s1s
空间限制:256MB
我的伪代码:
string a;
int sc;
cin>>a>>sc;
if(sc>=a.size()) return 0;
while(sc>0)
{
int i;
int j;
for(i=0;(i<a.size()-1) && (a[i]<=a[i+1]);i++)
{
continue;
}
a.erase(i,1);
sc--;
}
while(a.size()>1 && a[0]=='0')
a.erase(0,1);
cout<<a<<endl;
return 0;
有一些细节
1.字符串函数 eraser
其中的判断方式i<a.size()-1) && (a[i]<=a[i+1]
成立就删除这个字符
2.for循环找条件
for(i=0;(i<a.size()-1) && (a[i]<=a[i+1]);i++) continue;
这里也可以在循环后直接加;即可
3.两种特殊情况
1)擦除的比实际多
2)消除的足够了
满足一个即可结束或者输出
3.总总结
自我理解:
贪心主要是一种策略,在局部中产生最优解,追求代码的简洁直观性与可读性
完毕