題目:http://poj.org/problem?id=2376html
英文題強行看不懂,只看的懂輸入輸出,輸入n,m,下接n行每行一個區間兩個數左端點 l,有端點 rios
給出n個閉區間,求選擇最少的區間可以徹底覆蓋[1,m]spa
經典的區間覆蓋問題,按左端點升序排序code
首先當前卡點爲1,選擇小於等於當前卡點的,儘可能往右邊擴htm
直到大於當前卡點,再將卡點設爲右邊能擴展到的最大值blog
統計答案,注意閉區間和左端點最小區大於 1 的狀況
排序
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 #include<ctime> 8 #include<queue> 9 #include<stack> 10 #define fre(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout) 11 typedef long long LL; 12 typedef double db; 13 using namespace std; 14 15 const int oo=2147483647,TL=980,N=25001; 16 struct line 17 { 18 int l,r; 19 } 20 a[N]; 21 inline bool cmp(line x,line y) 22 { 23 return x.l<y.l; 24 } 25 int main() 26 { 27 int n,m,i,k,x,ans=0,j; 28 scanf("%d%d",&n,&m); 29 for (i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r); 30 sort(a+1,a+1+n,cmp); 31 for (k=x=i=j=1;i<=n;j=i) 32 { 33 while (a[i].l<=k&&i<=n&&x<m) x=max(x,a[i++].r); 34 ans++; 35 if ((k=x+1)>m||i==j) break; 36 } 37 printf("%d\n",k<=m?-1:ans); 38 return 0; 39 }
原本覺得水貪心能夠一邊A,結果交了七八遍全WAget
就到網上去下標程拍,修改了2次以後把標程給拍WA了,本身A掉了(233333333333)string
網上的題解也是錯的一大片啊~歡迎 Hackit
版權全部,轉載請聯繫做者,違者必究