贪心算法

  • 算法思想
  • 贪心算法概念及特点
    • 一本通 例 6.3 删数问题(Noip1994)
    • 【ICPC/NOI】基础-活动选择

算法思想

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解,因此贪心算法不是对所有问题都能得到全局最优解。
如果该问题从局部最优可以推出整体最优或者整体最优解的近似解,那么可以借助贪心算法实现。
步骤:首先将该问题分解为若干子问题,紧接着找出合适的贪心策略,求子问题的局部最优解,最终达到整体最优或者最优解的近似解。
【问题描述】超市有面值为1元、2元、5元的硬币,硬币数量不限。若他需要找零M元,问怎么找零才能使硬币数量最少?
【问题求解】如果要最少的硬币个数,则从面值最大的开始找零;当待找零金额大于该面值时,则计算需要多少个该面值的硬币;紧接根据剩余的金额,计算下一个面额所需要的数量;
最终待找零金额等于0则找零结束。
【程序设计】
1、添加头文件;
2、定义变量保存面额的数量;
3、定义数组保存不同面额;
4、定义数组保存不同面额找零的数目;
5、定义主函数;
6、输入获取待找零金额;
7、从最大面额开始到最小面额,所以要使用For循环结构;
8、循环结构设计:会先计算需要几个当前最大面额(求
商)以及剩余所需要找零的金额(求余),再进行下一个
面额;
9、最后输出所需要的面额。

#include <bits/stdc++.h>
using namespace std;
const int maxn=3;
int ans[maxn];//每个面值支付的数目
int coin[]= {1,2,5};//面值
int main() {int money;//待支付金额
cin>>money;
for(int i=maxn-1; i>=0; i--) {//从最大面值开始ans[i]=money/coin[i];//对应面值个数money=money-ans[i]*coin[i];//剩余金额
}
for(int i=maxn-1; i>=0; i--) {//输出对应数目
cout<<coin[i]<<":"<<ans[i]<<endl;
}
return 0;
}

是不是所有最少硬币问题都可
以用贪心法???
eg:7,6,1
支付12
最少硬币问题能否使用贪心法,跟硬币的面值有关。在给
定的硬币面值中,若任一面值的硬币,大于比它面值小的
硬币的面值和,便可以使用贪心法。
(例:1,5,11取15)。

【问题描述】假设你在贵阳花溪十里河滩有1个烧烤炉出租,当天有
一批游客已经确定了需要租赁的时间段下了订单,每个订单的金额都一
样,怎么选择预订的订单可以使受益最大?
求一种最优的安排方案,使得所有安排的订单数最多。
【怎么选择贪心策略】
按照最早开始的时间:
1-3,3-9,4-7,7-11
按照所需要的最短时间:
1-2,6-9,4-8,8-13
按照结束的最早时间:
1-3,3-9,4-7,7-11 或者 1-2,6-9,4-8,8-13 程序设计
1、添加头文件;
2、定义活动(结构体);
3、输入活动数目以及活动开始和结束时间;
4、确定策略;
5、按照活动结束时间排序;
6、如果当前活动结束时间低于下一个活动开始时间,安
排上,跟新为当前活动(for循环);
7、输出最终活动数目。

#include <bits/stdc++.h>
using namespace std;
struct meet{int s,e;//开始和结束时间
}a[10000];
bool cmp(meet a,meet b){return a.e<b.e;
}//返回先结束的
int main()
{int n;
cin>>n;
for(int i=0;i<n;i++){scanf("%d%d",&a[i].start,&a[i].end);
}sort(a,a+n,cmp);//按照结束时间进行排序
int num=1;//至少安排一个活动
int LastTime=0;//保存当前活动的下标
for(int i=1;i<n;i++){if(a[LastTime].end<a[i].start{//活动结束时间早于下一个开始时间
//一个开始时间
num++;//活动个数
LastTime=i;
}
}
cout<<num<<endl;
}

【问题描述】设有n个正整数,将它们连接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。
输入:n
N个数
输出:连成的多位数
【问题求解】此题很容易想到使用贪心法,把整数转化为字符
串,然后按从大到小的顺序连接起来;测试题目的例子也都符
合,但最后测试的结果却不全对。
【问题分析】12,121应该组成12121而非12112,那么是不
是相互包含的时候就从小到大呢?也不一定,如12,123就是
12312而非12123,这种情况就有很多种了。是不是此题不能
用贪心法呢?
【问题求解】正确判断依据:先把整数转换成字符串,然后在
比较a+b和b+a,如果a+b>=b+a,就把a排在b的前面,反
之则把a排在b的后面。
【程序设计】
1、添加头文件;
2、定义字符数组存储输入的字符串;
3、定义待输入字符串的个数;
4、定义规则进行排序;
5、输出最终结果。

#include <bits/stdc++.h>
using namespace std;
string s[25];
bool cmp(string a,string b) {//string可以直接比较。
return a+b>b+a;
}
int main() {int n;
cin>>n;
for(int i=0; i<n; i++) cin>>s[i];
sort(s,s+n,cmp);//贪心策略
for(int i=0; i<n; i++) cout<<s[i];
return 0;
}

贪心算法概念及特点

Ø贪心算法(又称贪婪算法):在对问题求解时,总是做出在当前看
来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到
的是在某种意义上的局部最优解;
Ø只用考虑局部情况,算法思想比较简洁、直观,实现非常简单,复
杂度较低,效率较高

一本通 例 6.3 删数问题(Noip1994)

键盘输入一个高精度的正整数n(n<=1000位),去掉其中任意s个数字后剩下的数字按原左右顺序将组成一个新的正整数。编程对给定的n和s(s<n的位数,且数据保证n删除s个数之后不为0,还是一个非0的整数),寻找一种方案,使得剩下的数字组成的数最小。
例如:153748要删除2个数,使得剩下的数字最小,应当删除5和7,得到1348。(注意:1087如果要删除1个数,删除1结果是最小的,得到结果87)
【输入】
第一行是一个高精度整数n
第二行是需要删除的位数s
【输出】
最后剩下的最小数
【样例输入】
153748
2
【样例输出】
1348

//删数问题
#include<iostream>
#include<cstring>
using namespace std;int main()
{string n;   //字符串,存放大数nint s;bool flag;cin>>n>>s;//递增区间删末尾字符,递减区间删除第一个size_t len = n.length();for(int i=1;i<=s;i++){for(size_t j=0;j < len;j++){if(n[j]>n[j+1]){//递减for(size_t k=j;k < len;k++)//向前移一个位置n[k]=n[k+1];break;}        }len--;}for(size_t i=0;i<len;i++){if(n[i]!='0') flag=true;if(flag) cout<<n[i];}return 0;
}

【ICPC/NOI】基础-活动选择

学校在最近几天有n(n<=100)个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。
现在给出nn个活动使用礼堂的起始时间begini和结束时间endi​(begini​<endi​),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。请问最多可以安排多少活动?
请注意,开始时间和结束时间均指的是某个小时的0分0秒,如:3 5,指的是3:00~5:00,因此3 5和5 9这两个时间段不算冲突的时间段。
【输入】
第一行一个整数n(n<=100)
接下来的n行,每行两个整数,第一个begini​,第二个是endi​(begini​<endi​<=32767)
【输出】
输出最多能安排的活动数
【样例输入】

11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13

【样例输出】

4
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=100;struct hd{int beginhTime;  int endhTime;
}a[MAX];bool cmp(hd a,hd b){return a.endhTime < b.endhTime;
}
int main()
{int n;cin>>n;for(int i=0;i<n;i++)cin>>a[i].beginhTime>>a[i].endhTime;sort(a,a+n,cmp);int num=1;int NextTime=0;for(int i=0;i<n;i++){if(a[NextTime].endhTime <= a[i].beginhTime){num++;NextTime=i;}}cout<<num<<endl;return 0;
}

贵州信息技术教师培训day18(贪心)相关推荐

  1. 2023年贵州信息技术教师培训(day19 分治)

    分治 分治算法 归并排序 例 三友行OJ( www.oj7.c)求逆序对. 一元三次方程求解 循环比赛日程表(match) 分治算法 什么是分治算法(Divide and Conquer)是一种解决复 ...

  2. 教师计算机校本培训记录,信息技术教师个人校本培训总结

    信息技术教师个人校本培训总结 为了拓宽学生的视野,引进好的教学方法,提高课堂教学的教学效果,充分利用网上资源服务于教学,现对我一个多月校本培训工作做如下总结: 一.认真参与校本培训 "国培& ...

  3. 教师计算机培训心得博客,信息技术提高培训心得体会

    信息技术提高培训心得体会 耒阳市南阳中心校罗文能 这几天我有幸参加了耒阳市小学教师信息技术提高培训,由衷感谢教育局和进修学校领导为我们搭建了一个很好的学习.提高的平台,作为二十一世纪的教师,利用信息技 ...

  4. 初中化学骨干教师培训需求调查分析--以贵州师范学院国培计划为例

    目 录 摘 要 I Abstract II 1调查研究 1 1.1 调查研究对象 1 1.2 调查研究方法和过程 1 1.2.1调查研究方法 1 1.2.2 调查过程 1 1.3 调查研究内容 2 2 ...

  5. 小学计算机教学教师培训,例谈小学信息技术课堂的有效教学

    例谈小学信息技术课堂的有效教学 在社会的各个领域,大家都不可避免地会接触到论文吧,论文可以推广经验,交流认识.为了让您在写论文时更加简单方便,以下是小编整理的例谈小学信息技术课堂的有效教学的论文相关内 ...

  6. 教师计算机网络培训工作总结,教师培训工作的自我总结

    [导读]教师培训工作的自我总结为好范文网的会员投稿推荐,但愿对你的学习工作带来帮助. 教师是一个平凡而又伟大的职业,那教师培训工作总结怎么写呢?下面小编就和大家分享教师培训工作总结,来欣赏一下吧. 教 ...

  7. 小学教师计算机应用操作培训总结,小学教师培训总结

    小学教师培训总结 一.在时间上和经费上予以保障和支持我校领导高度重视教师培训工作,长期坚持以教师的成长和发展作为教师教育的根本出发点和落脚点.首先在时间上和经费上予以保障和支持,我校今年教师培训费用达 ...

  8. 计算机教师应该读的书籍,信息技术教师读书心得

    "信息技术教育学是一门研究信息技术教育现象.本质和规律,优化教育过程,提高教育效果的科学.下面是学习啦为大家带来的信息技术教师读书心得,希望可以帮助大家. 信息技术教师读书心得范文篇1 激情 ...

  9. 计算机教师教学心得体会,信息技术教师教学的一点体会

    放飞学生的梦想 随着素质教育的不断深入,作为教师,我们认识到,教育不仅仅是追求百分之多少的升学率,而是追求每个学生生动.活泼.主动的发展.不仅仅是汇报时的总结.评比时的数据,而是教师与学生共度的生命历 ...

最新文章

  1. (五)Docker查看容器ip及指定固定IP
  2. 成为java高手_我如何想成为Java
  3. 第二章 API的理解和使用
  4. 如何正确地使用arXiv平台
  5. 日语输入法电脑版_攻略!教你如何用手机打日语
  6. telnet 远程登陆
  7. DeepFake捏脸真假难辨,汤姆·克鲁斯比本人还像本人!
  8. 20个BT下载网站,BT种子网站
  9. 金融行业认同的七本书
  10. 【UE4(虚幻)】学习笔记(六)----蓝图接口、事件分发器、子弹击打不同物体会有不同效果的实现思路、 数据表的使用与背包框架的搭设
  11. 《大咖讲Wireshark网络分析》—再来一个很妖的问题
  12. switch命令大全
  13. oracle 查询表空间所有表、及表所有的表空间
  14. 合肥工业大学机器人技术期末_合肥工业大学 机器人技术 作业和实验
  15. thinkpad计算机快捷键,Thinkpad笔记本键盘F1-F12功能键详细介绍
  16. sja1000 中断_关于单片机+SJA1000接收中断C语言编程的问题
  17. 数据库分片(Database Sharding)
  18. 契约锁助力大型能源组织“产-运-储-销-交易”文件电子签
  19. java 代码模板_请按模板要求,将【代码】替换为Java程序代码
  20. Java高级教程3_图形用户界面GUI

热门文章

  1. Visual Studio环境变量使用实例:使用环境变量来组织工程
  2. PMBOK#项目风险管理随记
  3. Unity Lighting -- 配置平行光源和天空盒
  4. MM的时尚笔记本(图)
  5. canvas的drawImage()方法
  6. Socket编程实现文件的传输
  7. 轉:个人对创业公司的思考
  8. 计算机应用班会,牢记嘱托 执着前行——计算机系召开学习王院长在毕业典礼上的讲话主题班会...
  9. 曲线切线的定义和导数(极限)
  10. css中什么是伪元素,CSS伪元素是什么?