贪心:区间相交问题

来源:互联网 发布:柯洁人工智能 编辑:程序博客网 时间:2024/05/16 02:36
/*区间相交问题问题描述:  给定x 轴上n 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。编程任务:  给定n 个闭区间,编程计算去掉的最少闭区间数。数据输入:  第一行是正整数n,表示闭区间数。接下来的n行中,每行有2 个整数,分别表示闭区间的2个端点。结果输出:计算出的去掉的最少闭区间数。输入示例    3    10 20    10 15    20 15输出文件示例     2  */#include <iostream>using namespace std;struct Coordinate{//坐标结构体    int x;    int y;};int main(){    int n,sum,now,a,b;//sum表示需要拿掉的坐标个数,now表示当前y最大的那个坐标的号    sum=now=0;    struct Coordinate pos[20],t;    cin>>n;    for(int i=0;i<n;i++)//保证输入的两个数中,小的赋给x,大的赋给y    {        cin>>a>>b;        pos[i].x=a<b?a:b;        pos[i].y=a<b?b:a;    }    for(int i=0;i<n-1;i++)//终点,按y升序排序,因为是贪心算法,所以要尽量让剩下选择的余地极大化!也就是要尽量选择y小的        for(int j=i+1;j<n;j++)            if(pos[i].y>pos[j].y)            {                t=pos[i];                pos[i]=pos[j];                pos[j]=t;            }    for(int i=1;i<n;i++)//now的初值是0,即第一个坐标(y最小),从第二个坐标开始一直到最后一个一个和now比,比较中now可能会改变    {        if(pos[i].x<=pos[now].y)//如果相交,就舍弃,sun++            sum++;        else//如果不相交,就now=i,如果以后的坐标不与新的now相交,那么肯定也不会与老的now相交            now=i;    }    cout<<sum<<endl;}


原创粉丝点击