Description
Input
Output
Sample Input
3 10 1 7 3 6 6 10
Sample Output
2
Hint
题意:给N组测试数据 用最少组数覆盖T时间 如果不能全覆盖就输出-1.
思路:贪心;
具体:先结构体排序,再递归找比当前数据的右端点小的左端点,如果有就标记继续递归最大的右端点,否则就return -1退出递归。
细节:第一位必须是1,在输入的时候就判断。
ac代码(效率不是太高):
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int vis[1100009]; 6 int a,b; 7 struct node 8 { 9 int a; 10 int b; 11 } d[25500]; 12 int dig(int x,int y,int z) 13 { 14 int p=0,q=0,n=-10000; 15 if(y>=b) 16 return z; 17 for(int i=x; i<=a; i++) 18 { 19 if(!vis[i]) 20 if(d[i].a<=y+1) 21 { 22 vis[i]=1; 23 p=1; 24 if(d[i].b>=y+1) 25 if(d[i].b>n) 26 { 27 q=i; 28 n=d[i].b; 29 } 30 } 31 } 32 if(p==0) 33 return -1; 34 dig(q,n,z+1); 35 } 36 int cmp(struct node a,struct node b) 37 { 38 if(a.a==b.a) 39 return a.b<b.b; 40 return a.a<b.a; 41 } 42 int main() 43 { 44 int i,j; 45 while(scanf("%d%d",&a,&b)!=EOF) 46 { 47 int flag=0; 48 memset(vis,0,sizeof(vis)); 49 for(i=1; i<=a; i++) 50 { 51 int t; 52 scanf("%d%d",&d[i].a,&d[i].b); 53 if(d[i].a==1) 54 flag=1; 55 } 56 sort(d+1,d+a+1,cmp); 57 if(flag==0) 58 printf("-1\n"); 59 else 60 printf("%d\n",dig(1,d[1].b,1)); 61 } 62 }
poj 2376 Cleaning Shifts,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/Xacm/p/3825571.html