15-HDU-6119

NWPU-寒假作业三
小小粉丝度度熊
度度熊喜欢着喵哈哈村的大明星——星星小姐。
为什么度度熊会喜欢星星小姐呢?
首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听。
但这都不是最重要的,最重要的是,星星小姐拍的一手好代码!
于是度度熊关注了星星小姐的贴吧。
一开始度度熊决定每天都在星星小姐的贴吧里面签到。
但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到。
不过度度熊并不是非常悲伤,因为他有m张补签卡,每一张补签卡可以使得某一忘签到的天,变成签到的状态。
那么问题来了,在使用最多m张补签卡的情况下,度度熊最多连续签到多少天呢?
Input
本题包含若干组测试数据。
第一行两个整数n,m,表示有n个区间,这n个区间内的天数,度度熊都签到了;m表示m张补签卡。
接下来n行,每行两个整数(l[i],r[i]),表示度度熊从第l[i]天到第r[i]天,都进行了签到操作。
数据范围:
1<=n<=100000
0<=m<=1000000000 0<=l[i]<=r[i]<=1000000000
注意,区间可能存在交叉的情况。
Output
输出度度熊最多连续签到多少天。
Sample Input
2 1
1 1
3 3
1 2
1 1
Sample Output
3
3
思路:本题给定的区间有重叠部分,因此先合有并重叠部分的区间。
      1.先按区间左端点从小到大进行排序。
        用a的节点数组存储区间,用sort(a+1,a+1+n,cmp);排序。
        因为数组a的数据类型不是基本数据类型,而是结构体类型,因此需要写一个
        cmp函数,因从小到大排序,故代码如下。
       
        int cmp(node c,node d)
        {
          if(c.x!=d.x) return c.x<d.x;
          else return c.y<d.y;
        }
      2.合并有重合部分的区间。
        排序之后就便于合并了,如果第i+1个区间的左端小于第i个区间的右端,
        则可以合并这两个区间,调整第i个区间的右端即可实现。
        if(a[i].x<=b[k].y)
        b[k].y=max(a[i].y,b[k].y);
       
      3.找到最大长度,用尺取法。
       尺取法是不断移动左右端点(左l有r),找到最大值ans。先初始化l和r都是1,
       间隔cur=0,连续签到天数ans=0;移动右端点(r++),
        cur+=b[r].x-b[r-1].y-1;
       (间隔需减1,因为2-1=1,但第一天和第二天是连续的)。
        ans=b[r].y-b[l].x+1+m-cur;
       (天数需加1,因为2-1=1,但第一天和第二天总共有两天)。
       当cur>m(即间隔大于补签卡时),
        cur-=b.[l+1]-b[l]-1;
        l++;
       去除l所在的间隔,并l向右移动一个单位。
       程序结束时更新出最大的ans。
     
      重在逻辑!!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/Irving0323/article/details/81064755
15
hdu
今日推荐