• Hdu-6119 小小粉丝度度熊 尺取


    题面

    题意:在一大段时间里,告诉你,你签到了哪些区间,现在再给你m张补签卡,问你最多能实现连续签到多少天

    题解:那些时间区间是有重叠的,所以我们先排序离散,并得到哪些区间是可以补签的,这样问题就变成,签过的天是0,没签过的是1,然后问区间和<=m的最大长度是多少,就转换为Poj-3061差不多一样的问题了(长度最长与最短)。

     1 #include<bits/stdc++.h>
     2 #define N 100010 
     3 using namespace std;
     4 struct rec
     5 {
     6     int l, r;    
     7     bool operator < (const rec &a) const 
     8     {
     9     if (l != a.l) return l < a.l;
    10     return r < a.r;
    11     }
    12 }b[N],a[N];
    13 int ans,n,m,cnt;
    14 int main()
    15 {
    16     while (scanf("%d %d", &n, &m)!=EOF) 
    17     {
    18         for (int i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r);
    19         sort(a+1,a+n+1);
    20         b[1]=a[1];
    21         cnt=1;
    22         for (int i=2;i<=n;i++)
    23             if (a[i].l<=b[cnt].r || a[i].l-b[cnt].r==1)
    24                 b[cnt].r=max(b[cnt].r,a[i].r);else 
    25                 {
    26                     cnt++; 
    27                     b[cnt]=a[i];
    28                 }
    29         ans=0;
    30         for (int l=1,r=1;r<=cnt;r++)
    31         {
    32             if (r!=1) 
    33             {
    34                 m-=b[r].l-b[r-1].r-1;
    35                 while (m<0) 
    36                 {
    37                     m+=b[l+1].l-b[l].r-1;
    38                     l++;
    39                 }
    40             }
    41             ans=max(ans,b[r].r-b[l].l+1+m);
    42         }
    43         printf("%d
    ", ans);
    44     }
    45     return 0;
    46 }
    Anderyi!
  • 相关阅读:
    AOP 和 前置通知,后置通知
    使用Spring 简化MyBatis
    核心一:DI
    环境搭建及创建对象方式及赋值(注入)
    核心一:IoC
    Spring框架简介
    判断两个矩形是否相交的4个方法
    计算旋转角度
    浅析adb命令
    如何选择开源许可证?
  • 原文地址:https://www.cnblogs.com/qywhy/p/9692472.html
Copyright © 2020-2023  润新知