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

本文介绍了一种算法,通过处理重叠的时间区间和使用补签卡,来最大化连续签到的天数。该算法首先对时间区间进行排序和离散化处理,确定可以使用补签卡的区间,然后将问题转化为求区间和小于等于补签卡数量的最大长度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面

题意:在一大段时间里,告诉你,你签到了哪些区间,现在再给你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\n", ans);
44     }
45     return 0;
46 }

 

转载于:https://www.cnblogs.com/qywhy/p/9692472.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值