贪心
来源:互联网 发布: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个用空格隔开的整数:N和S
输出格式:
一个整数,即为叠奶牛的最小只数
第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;
}
- 贪心!
- 贪心~
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- IOS与安卓的区别
- Cloudera Manager5.11.0部署spark2.2.0版本
- 用conda安装tensorflow-gpu1.4
- JAVA实现魔术师发牌问题
- 快速排序
- 贪心
- 直接使用命令去下载文件(简单)
- Android Studio3.0开发JNI流程------JNI静态注册和动态注册(多个类的native动态注册-经典篇)
- Lua之__index与__newindex
- 2-SAT 题表
- 动态规划 python 实现 三角形最大值路径
- SDUT-3377-->数据结构实验之查找五:平方之哈希表
- 测量lisp小程序
- MyBatis自带的缓存配置(Cache)