第二周ACM总结——贪心算法

一、头文件与宏定义:

#include<bits/stdc++.h>	
  
  #define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
  #define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
  #define pb push_back
  #define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
  #define fi first
  #define se second
  #define mp make_pair
  
const int inf = 0x3f3f3f3f;//无穷大
  const int maxn = 1e5;//最大值。
  typedef long long ll;

  typedef long double ld;
  typedef pair<ll, ll>  pll;
  typedef pair<int, int> pii;

二、贪心算法:
1、算法思想
贪心法的基本思路:
是将一个问题分成若干个小问题,求取小问题的解,取出其中的最优解,在整合起来获得整个问题的最优解,即寻找最优解。
算法存在问题:
① 不能保证求得的最后解是最优的;
②不能用来求最大或最小解问题;
③只能求满足某些约束条件的可行解的范围。
实现该算法的过程:
从问题的某一初始解出发;
进行排序和线性运算;
用进行处理测试组数while ;
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解。

2、做题情况
这套题,虽然感觉很困难,但想办法还是能AC几道题的,做过这些题目使我对贪心算法印象加深,没有以前感觉那么抽象,算是有进步吧,但还是不熟练,还需要加强训练。

3、典型例题分类分析
①区间调度问题:每次从剩下的会议中选择具有最早结束时间且与已安排的会议相容的会议安排。再按照结束时间从小到大排序
②背包问题:选单位价值小的,再按照单位价值排序,即性比价。
心得:1.看清楚题目(物品可不可分割)。2.找出贪心策略3.判断达到背包容量时,要认真考虑。
③货币找零:每次选择最大的钱,如果最后超过了,再选择次大的面值,然后次次大的面值,一直到最后与找的钱相等。
④最优装载问题:重量最轻的最先装;
⑤字典序最小问题:目标是要构造字典序尽可能小的字符串T。把‘不断取S得开头和末尾中较小的一个字符放到T的末尾’,字典序比较S和将S反转后的字符串S’。
⑥分发饼干:原则是大尺寸的饼干分给胃口大的孩子,即将饼干和孩子分别进行降序排列,然后进行反向比较循环。

例题
①整数区间:  
•读取闭区间的个数及它们的描述;   
•找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。
分析:
   •首先按b1<=b2<=…<=bn排序。每次标记当前区间的右端点x,并右移当前区间指针,直到当前区间不包含x,再重复上述操作。
   •如下图,如果选灰色点,移动到黑色点更优。

 for(int i=1,x=-1;i<=n;++i)
  {
       if (x>=aa[i].a) continue;//如果当前区间包含标记点,就跳过。
       ++sum;   x=aa[i].b;             //更新标记点。
   }

②写作业:
一个人要写作业,但是每次只能做一个,每个作业都有对应的截止时间,如果过了截止时间就会扣相应的分数,求扣的最小分数
思路:先截至的先安排、扣分多的尽早安排。如果一定得扣分了,替换前面一个已安排但扣分较少的。

从前到后开始遍历,遍历到第i个开始的时候已经过了截止时间,然后记录下这个数和这个数对应的下标。
代码:

int pos = i,tmpScore = work[i].score;
             for(int j=0;j<i;j++)
            {
                if(work[j].score<tmpScore && !work[j].flag)
                {   tmpScore = work[j].score;
                    pos = j;
                }
            }

三、学习感悟

经过这两周的算法学习,我发现算法不仅仅局限于课堂,也不仅仅局限于作业题。这是一门难度很大的课程,不仅对于算法的知识要求很高,并且对于思维的广度与深度要求也很高。我也深深的体会到了对于初学者来说AC一个题的艰辛路程,一个题目,首先找对思路是关键,然后还要有能写出正确代码的能力(这其中包括Wrong answer,Time limit等问题),这就需要我在以后的学习中不断地深入,专注的投入,有钻研和不放弃的精神。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值