1. 程式人生 > >Hdu-6119 小小粉絲度度熊 尺取

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

!= def 離散 for its 實現 i++ 題意 main

題面

題意:在一大段時間裏,告訴你,你簽到了哪些區間,現在再給你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 }

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