贪心算法
贪心算法:只看局部最优解,不考虑全局最优解(不是对所有问题都能得到整体最优解)
(也许不是一个好算法)
不过,贪心算法,比搜索快多了(特定情况)(也好记多了)
例如:
1321:【例6.3】删数问题(Noip1994) |
(ybt题库)
附上代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string n;
int s;
int main(){
cin>>n;
cin>>s;
for(int i=1;i<=s;i++){
bool f=0;
for(int j=0;j<n.size();j++){
if(n[j]>n[j+1]){
n.erase(j,1);
f=1;
break;
}
}
if(!f){
n.erase(n.size()-1);
}
}
int pos=0;
while(n[pos]=='0' && pos<n.size()-1){
pos++;
}
for(;pos<n.size();pos++){
cout<<n[pos];
}
return 0;
}
(非常简单的一道)
也没什么好讲的
值得注意的反而不是贪心算法
而是删前导零的操作,易错,需要注意
来讲讲这道题用贪心算法的规律:
175438
第一次:删7 变成15438
第二次:删5 变成1438
第三次:删4 变成138
第四次:删8 变成13
(结束)
什么规律呢?
看删掉的数呗
第一次:删7
继续看
第二次:删5
这时候我们看看下一个数 7的下一个:5 5的下一个:4
发现了什么?
降序,1到7是升序,降序时删了7
规律有了,还愁代码吗?
判断:只要发生降序(这个数大于下个数),就删除当前的数
最后,还是要注意前导零(不然不给过)
OK,结束了

浙公网安备 33010602011771号