贪心算法

贪心算法只看局部最优解,不考虑全局最优解(不是对所有问题都能得到整体最优解)

贪心算法一般按如下步骤进行:
①建立数学模型来描述问题。
②把求解的问题分成若干个子问题。
③对每个子问题求解,得到子问题的局部最优解。
④把子问题的解局部最优解合成原来解问题的一个解
 

(也许不是一个好算法)

 

不过,贪心算法,比搜索快多了(特定情况)(也好记多了)

 

例如:


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,结束了

 

posted @ 2022-07-28 21:12  wuhongtai  阅读(114)  评论(1)    收藏  举报