一、经典例题

例一:排队接水

题意:n个人到r个水龙头接水,装满水桶的时间分别是t1,t2,t3....

接水时间是整数且互不相等,怎样安排顺序使每个人等待的

时间和最小。

题解:排队越靠前计算次数越多,因此越小的排在前面。

交换一下看看

【经典】Noip贪心

例二:均分纸牌

题意:n堆纸牌,每堆若干张,但纸牌总数为n的倍数,求最少

移动多少次每堆纸牌的张数一样。

题解:贪心模拟,先让第一个人纸牌达到平均数,只交换1、2两

人的纸牌,不用考虑第2人纸牌不够给第1人的情况,因为分牌的

实际情况是让牌数最多的那堆先移动,所以第2人纸牌是绝对够提

供的。然后让第二人纸牌达到平均数。

例三:删数问题

题意:输入一个高精度正整数n,求删掉s个数位后,组成的新数最小。

题解:每次删一个使剩下的数最小的数。删去一个数后剩下数的位数

就确定了,只需要让最高位最小。

例四:导弹拦截问题

题意:给出n个炮弹高度,用导弹拦截,每一种导弹

发射的高度不能超过之前发射的高度,问一种导弹最多拦截

多少,要拦截所有需要多少导弹。

题解:第一问最长下降子序列。第二问:

做法一:贪心让之前高度最小的导弹拦截。

做法二:最少链划分 = 最长反链长度 

做法二就是求最长上升序列长度。

例五:活动选择

题意:选择尽量多的区间,两两不相交。

题解:按结束时间排序,每次选择区间右端点最小的,

为剩下的区间留下更多的空间。

例六:整数区间

题意:数轴上有n个区间,选择尽量少的点使每个区间都有点

题解:通俗的想,把区间想成一块块木板,把要找的点想成钉子,

如果你的钉子很靠前的话,后面的木板就可能钉不到,每次把钉子

钉在你要钉的木板最后。

 

CODEVS线段覆盖大全//以前做的和现在码风不一样,一样好看=u=

PS:有的不是贪心一起整理了。

a、最多不相交线段覆盖所有区间

题解:右端点升序排序,左端点相同右端点小的优先。

 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct E
{
    int x,y;
}s[1000002];
bool cmp(E a,E b)
{
    if(a.y==b.y)return a.x<b.x ;
    return a.y<b.y;
}
int n,ans,last;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&s[i].x,&s[i].y);
        if(s[i].x>s[i].y)
        swap(s[i].x,s[i].y);
    }
    sort(s+1,s+n+1,cmp);
    for(int i=1;i<=n;i++)
    if(s[i].x>=last)
    {
        ans++;
        last=s[i].y;
    }
    printf("%d\n",ans);
    return 0;
}
线段覆盖1

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-08
  • 2021-07-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-12
  • 2021-12-15
  • 2021-05-31
  • 2021-07-07
  • 2021-08-16
  • 2021-09-17
相关资源
相似解决方案