贪心

来源:互联网 发布:mac好用的绘图 编辑:程序博客网 时间:2024/06/02 02:40

  刚刚学了贪心,现在就来总结一下。

 

概念:在学贪心之前,我们要先了解贪心是什么东西。首先,贪心是一种策略,一种思想。在对问题进行求解时,总是能作出当前看来最好的选择,但是它不是从整体最优考虑,它所作出的仅是在某种意义上的局部最优解。

         贪心没有固定的算法框架,它在不同的题目中出现的形式都是不一样的。但是它算法设计的关键是贪心策略的选择。也就是说想要贪心,你就得从题目的某个条件为基础,根据这个条件选择如何能得到局部的最优解。贪心在大多数情况下都是能将题目AC的,但是如果遇到了某种问题,就能在不是完全AC的情况下得到最高的分数,这就是“贪心”策略名字的由来。
    

 上面的是贪心的概念,现在就来讲一下贪心的解题思路

 

解题思路:

   1、看看这题是否适合贪心(如果这道题都不能用贪心的话,那不就等于跳楼吗)

   2、选择贪心的标准(这个是关键)

   3、根据标准把求解的问题分成若干个子问题

   4、对每一个子问题求解,得到子问题的局部最优解

   5、把每个子问题的解局部最优解合成原来问题的一个解

  讲了这么多,现在就来看几道例题吧,,,

  

题目简述:农夫有一个长为S(1<=S<2,000,000,007)的书架,同时他又有n头奶奶牛,第i头奶牛的长度为h_i。他想利用这n只奶牛通过“叠罗汉”的方式叠成一座奶牛塔直至书架的顶端,问最少叠几只奶牛能够到达书架的顶端。(保证有解)

输入格式:

1:2个用空格隔开的整数:NS        

输出格式

一个整数,即为叠奶牛的最小只数

2..N+1:i+1行是1个整数:H_i

输入样例:

6 40

6 1811 13 19 11

输出样例:

   3 19+18+13

题目分析:这道题的贪心标准其实十分明显,可以将奶牛从大到小进行排序,根据从大到小排序后的奶牛进行叠塔,最后的数目一定是最小的(至少没有数比他大)。

 

  接下来的是源代码:

  

#include<bits/stdc++.h>

usingnamespace std;

intcow[20001],n,s;

boolcmp(inta,int b){//排序条件,从大到小

  return (a>b);

}

intmain(){

  cin>>n>>s;

  for (inti=1;i<=n;i++)cin>>cow[i];//读入奶牛高度

  sort(cow+1,cow+n+1,cmp);//排序

  intans=0;//ans既是叠塔时奶牛的下标,又是最后的奶牛数

  while (s>0)//如果还没到书架顶的话

   s-=cow[++ans];//等同于ans++;s=s-cow[ans].

  cout<<ans;//输出

  return 0;

}