POJ2376_Cleaning Shifts_C++

  题目:http://poj.org/problem?id=2376

  英文题强行看不懂,只看的懂输入输出,输入n,m,下接n行每行一个区间两个数左端点 l,有端点 r

  给出n个闭区间,求选择最少的区间能够完全覆盖[1,m]

  经典的区间覆盖问题,按左端点升序排序

  首先当前卡点为1,选择小于等于当前卡点的,尽量往右边扩

  直到大于当前卡点,再将卡点设为右边能扩展到的最大值

  统计答案,注意闭区间和左端点最小区大于 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,结果交了七八遍全WA

  就到网上去下标程拍,修改了2次之后把标程给拍WA了,自己A掉了(233333333333)

  网上的题解也是错的一大片啊~欢迎 Hack

版权所有,转载请联系作者,违者必究

联系方式:http://www.cnblogs.com/hadilo/p/5932395.html

时间: 2024-11-05 11:30:52

POJ2376_Cleaning Shifts_C++的相关文章