第六章 贪心
作者:互联网
贪心类题型没有固定的模板只有多做题,总结经验。
目录
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