贪心主要有两种问题,分为简单贪心和区间贪心
1、简单贪心
比较好理解和思考;例如已有些单个数字怎样组合最大;出售固定量商品,怎样组合最赚钱。
2、区间贪心
(1)在一个大的区间内,尽量放入给出的小区间,要求两两不相交,一般求能放入多少个区间,ans即为放入区间数。
struct inteval{
int x,y;
};
bool cmp(const inteval a,const inteval b){
if(a.y!=b.y) return a.y>b.y;
return a.x<b.x;
}
vector<inteval> v;
int main(){
//......
//在v中存入区间
//......
sort(v.begin(),v.end(),cmp);//排序
int Lastx=v[0].x;
int ans=1;
for(int i=0;i<v.size();i++){
if(v[i].y<=Lastx){
Lastx=v[i].x;
ans++;
}
}
}
(2)区间选点问题
对于N个闭区间,求需要确定多少个点,才能使得每个区间至少存在一个点
几乎和上一个问题一模一样,将判断条件从 <= 改为 < 即可(因为闭区间端点的点在区间内,不需要新的点)
struct inteval{
int x,y;
};
bool cmp(const inteval a,const inteval b){
if(a.y!=b.y) return a.y>b.y;
return a.x<b.x;
}
vector<inteval> v;
int main(){
//......
//在v中存入区间
//......
sort(v.begin(),v.end(),cmp);//排序
int Lastx=v[0].x;
int ans=1;
for(int i=0;i<v.size();i++){
if(v[i].y<Lastx){ //只需要修改此处!!!
Lastx=v[i].x;
ans++;
}
}
}