其他分享
首页 > 其他分享> > 第六章 贪心

第六章 贪心

作者:互联网

贪心类题型没有固定的模板只有多做题,总结经验。

目录

905. 区间选点

在这里插入图片描述
https://www.acwing.com/problem/content/description/907/

本题和区间合并那种题几乎一样的思路,不过还是有差别的。
首先:按左端点从小到达排,这是没有悬念的必须做的。
这时候分析,会有如下几种情况:
情况一:
在这里插入图片描述
这种包含的情况,我们要选小的,因为我们要的是公共部分。
情况二:
在这里插入图片描述
这种相交的情况选,相交的。
情况三:
在这里插入图片描述
不相交的情况选b,个数加1。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct student 
{
    int x,y;
}stu[N];
bool cmp(student a,student b)
{
    return a.x<b.x;
}
int main(void)
{
    int n; cin>>n;
    
    for(int i=0;i<n;i++) cin>>stu[i].x>>stu[i].y;
    
    sort(stu,stu+n,cmp);
    
    int ans=1;
    int startx=stu[0].x,endx=stu[0].y;
    for(int i=1;i<n;i++)
    {
        if(stu[i].x<=endx&&stu[i].y<=endx) startx=stu[i].x,endx=stu[i].y;
        else if(stu[i].x<=endx&&stu[i].y>endx) startx=stu[i].x;
        else ans++,startx=stu[i].x,endx=stu[i].y;
    }
    cout<<ans<<endl;
    return 0;
}

908. 最大不相交区间数量

在这里插入图片描述
https://www.acwing.com/problem/content/910/

老规矩:左端点从小到大排序
第一种情况:
在这里插入图片描述
这种得选a,这样右边的区间的选择范围才会更大。
第二种情况:
在这里插入图片描述
此时不用变,还是a这样才会有更大的空间。
第三种情况:
在这里插入图片描述
选b,数量加1

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct student
{
    int x,y;
}stu[N];
bool cmp(student a,student b)
{
    return a.x<b.x;
}
int main(void)
{
    int n; cin>>n;
    for(int i=0;i<n;i++) cin>>stu[i].x>>stu[i].y;
    sort(stu,stu+n,cmp);
    
    int ans=1;
    int startx=stu[0].x,endx=stu[0].y;
    
    for(int i=1;i<n;i++)
    {
        if(stu[i].y<endx) startx=stu[i].x,endx=stu[i].y;
        else if(stu[i].x>endx) ans++,startx=stu[i].x,endx=stu[i].y;
    }
    
    cout<<ans<<endl;
    return 0;
}

913. 排队打水

在这里插入图片描述
https://www.acwing.com/problem/content/description/915/

思路: 由于若把时间长的放在后面接水,那么就较少人等,所以排序+贪心即可。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
long long int a[N],s[N];
int main(void)
{
    int n; cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    long long int sum=0;
    for(int i=1;i<=n-1;i++) s[i]=s[i-1]+a[i],sum+=s[i];
    //1代表的就是第二个人的等待时间,第一个人的等待时间为零
    cout<<sum<<endl;
    return 0;
}

104. 货仓选址

在这里插入图片描述

https://www.acwing.com/problem/content/description/106/
选中间的位置最优

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],sum;
int main(void)
{
    int n; cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    int area=a[n/2];
    for(int i=0;i<n;i++) sum+=abs(area-a[i]);
    cout<<sum<<endl;
    return 0;
}

标签:startx,const,int,stu,student,第六章,include,贪心
来源: https://blog.csdn.net/qq_46527915/article/details/117048126