标签:
input | output |
---|---|
1
-1 0
-5 -3
2 5
0 0
|
No solution
|
1
-1 0
0 1
0 0
|
1
0 1
|
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 7 const int maxn=100000+4; 8 9 struct Edge 10 { 11 int l,r; 12 }edge[maxn]; 13 14 bool cmp(Edge a,Edge b) 15 { 16 if(a.l==b.l) 17 return a.r<b.r; 18 return a.l<b.l; 19 } 20 21 int ans[maxn]; 22 23 int main() 24 { 25 int m; 26 27 while(scanf("%d",&m)!=EOF) 28 { 29 30 int tot=1; 31 32 scanf("%d%d",&edge[tot].l,&edge[tot].r); 33 34 if(edge[tot].l==0&&edge[tot].r==0) 35 break; 36 37 while(edge[tot].l||edge[tot].r) 38 { 39 tot++; 40 scanf("%d%d",&edge[tot].l,&edge[tot].r); 41 } 42 43 sort(edge+1,edge+tot,cmp); 44 45 int num=0; 46 int cur=0; 47 int cnt=0; 48 edge[0].l=edge[0].r=-55555; 49 50 bool flag=true; 51 52 while(true) 53 { 54 if(cur>=m) 55 { 56 break; 57 } 58 59 60 //这里犯了一个极大的错误 61 //我刚开始的代码是这样的: 62 //while(cnt+1<tot&&edge[cnt+1].l<=cur&&edge[cnt+1].r>edge[cnt].r) 63 // cnt++; 64 //我们是要找出满足左端点在cur左边的所有线段中, 65 //的右端点最远的点 66 //所以要用变量right表示当前最远的, 67 //然后跟right比较 68 //而不是跟前面的线段比较。 69 70 71 int right=cur; 72 for(int i=cnt;i+1<tot;i++) 73 { 74 if(edge[i+1].l<=cur&&edge[i+1].r>right) 75 { 76 cnt=i+1; 77 right=edge[cnt].r; 78 } 79 } 80 81 if(edge[cnt].r<=cur) 82 { 83 flag=false; 84 break; 85 } 86 87 else 88 { 89 ans[num++]=cnt; 90 cur=edge[cnt].r; 91 } 92 } 93 94 if(!flag) 95 { 96 printf("No solution\n"); 97 98 continue; 99 } 100 101 printf("%d\n",num); 102 103 for(int i=0;i<num;i++) 104 { 105 printf("%d %d\n",edge[ans[i]].l,edge[ans[i]].r); 106 } 107 108 } 109 110 return 0; 111 }
Timus 1303 Minimal Coverage DP或贪心
标签:
原文地址:http://www.cnblogs.com/-maybe/p/4483609.html