zoukankan      html  css  js  c++  java
  • HDU-6119

    度度熊喜欢着喵哈哈村的大明星——星星小姐。 

    为什么度度熊会喜欢星星小姐呢? 

    首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听。 

    但这都不是最重要的,最重要的是,星星小姐拍的一手好代码! 

    于是度度熊关注了星星小姐的贴吧。 

    一开始度度熊决定每天都在星星小姐的贴吧里面签到。 

    但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到。 

    不过度度熊并不是非常悲伤,因为他有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
    
    
            
     

    Hint

    样例一:度度熊补签第2天,然后第1天、第二天和第三天都进行了签到操作。
    样例二:度度熊补签第2天和第3天。
    
            
     

    题解:这里是贪心;我们可以先合并重合区间,然后排序,逐个遍历;看代码就明白了,很简单的

    AC代码为:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 
     7 using namespace std;
     8 
     9 
    10 const int maxn = 1e5 + 10;
    11 int sum[maxn];
    12 
    13 
    14 struct node {
    15 int left;
    16 int right;
    17 node() {}
    18 node(int li, int ri)
    19 {
    20 left = li;
    21 right = ri;
    22 }
    23 }p[maxn];
    24 
    25 
    26 bool cmp(node a, node b)
    27 {
    28 if (a.left == b.left)
    29 return a.right < b.right;
    30 return a.left < b.left;
    31 }
    32 
    33 
    34 int main()
    35 {
    36 int n, m;
    37 while (~scanf("%d%d", &n, &m))
    38 {
    39 memset(sum, 0, sizeof(sum));
    40 
    41 
    42 for (int i = 1; i <= n; i++)
    43 {
    44 cin >> p[i].left >> p[i].right;
    45 }
    46 
    47 
    48 sort(p + 1, p + n + 1, cmp);
    49 
    50 
    51 int cnt = 0, Max;
    52 for (int i = 1; i <= n; i++)
    53 {
    54 int l = i, j = i + 1, Max = p[i].right;
    55 while (p[j].left <= Max && j <= n)
    56 {
    57 Max = max(Max, p[j].right);
    58 j++;
    59 }
    60 i = j - 1;
    61 p[cnt++] = node(p[l].left, Max);
    62 
    63 
    64 }
    65 
    66 
    67 for (int i = 1; i<cnt; i++)
    68 {
    69 sum[i] = sum[i - 1] + p[i].left - p[i - 1].right - 1;
    70 }
    71 
    72 
    73 int max_total = m;
    74 for (int l = 0, r = 0; l<cnt; l++)
    75 {
    76 while (sum[r] - sum[l] <= m && r<cnt)
    77 {
    78 r++;
    79 }
    80 
    81 
    82 max_total = max(max_total, p[r - 1].right - p[l].left + 1 + m + sum[l] - sum[r - 1]);
    83 }
    84 
    85 
    86 cout << max_total << endl;
    87 }
    88 
    89 
    90 return 0;
    91 }
    View Code
  • 相关阅读:
    题解 CF934A 【A Compatible Pair】 ——贪心
    洛谷 P3381 【【模板】最小费用最大流】
    洛谷 P3376 【【模板】网络最大流】
    洛谷 P1027 【Car的旅行路线】
    TYVJ P1039 【忠诚2】
    洛谷 P1273 【有线电视网】
    斯特林数相关
    从 简单容斥 到 min-max 容斥 与 二项式反演
    POI2011 Lightning Conductor
    LOJ6089 小 Y 的背包计数问题
  • 原文地址:https://www.cnblogs.com/csushl/p/9386603.html
Copyright © 2011-2022 走看看