POJ1328

来源:互联网 发布:安卓转码软件 编辑:程序博客网 时间:2024/05/16 12:36
#include<stdio.h>#include<math.h>#define scale 1000#define bool int#define true 1#define false 0void qsort(double s[],double s1[], int l, int r){    int i, j;    double x,y;    if (l < r)    {        i = l;        j = r;        x = s[i];y= s1[i];        while (i < j)        {            while(i < j && s[j] > x) j--; /* 从右向左找第一个小于x的数 */            if(i < j) {s[i] = s[j];s1[i] = s1[j];i++;}            while(i < j && s[i] < x) i++; /* 从左向右找第一个大于x的数 */            if(i < j) {s[j] = s[i];s1[j] = s1[i];j--;}        }        s[i] = x;s1[i]= y;        qsort(s,s1, l, i-1); /* 递归调用 */        qsort(s,s1,i+1, r);    }}int main(){int x,y,n,d,nagetiveY;int i,count,caseindex=0,flag;double left[scale],right[scale],temp;double l,r;while(scanf("%d%d",&n,&d)!=EOF){if(n==0&&d==0) break;count=0;caseindex++;nagetiveY=0;for(i=0;i<n;i++){scanf("%d%d",&x,&y);temp=sqrt(d*d-y*y);left[i]=x-temp;right[i]=x+temp;if(y<0||y>d) nagetiveY=1;//纵坐标小于0 或 纵坐标大于d 均事做不可行}if(d<=0) {printf("Case %d: -1\n",caseindex);continue;} //d必须为正。if(nagetiveY==1) {printf("Case %d: -1\n",caseindex);continue;}//排序qsort(right,left,0,n-1);flag=0;//贪心选择for(i=0;i<n;i++){if(flag==0){l=left[i];r=right[i];flag=1;count++;//printf("flag=0,l=%f,r=%f\n",l,r);}else{l=(left[i]>l)?left[i]:l;r=(right[i]<r)?right[i]:r;//printf("flag=1,l=%f,r=%f\n",l,r);if((r-l)<0) {flag=0;i--;} }}//输出结果printf("Case %d: %d\n",caseindex,count);}return 0;}


测试数据,来源于poj讨论组

2 5-3 4-6 34 5-5 3-3 52 33 320 8-20 7-18 6-5 8-21 8-15 7-17 5-1 5-2 3-9 61 22 33 44 55 66 77 88 79 610 50 02 30 22 32 30 21 33 31 2-3 22 48 52 4-4 4-3 3-3 1-3 0-1 00 56 03 01 2-3 12 13 21 2-3 12 11 20 22 30 22 34 -54 34 32 36 -93 -31 2-3 22 16 21 21 21 2-3 12 10 01 20 22 30 21 33 101 102 34 53 51 102 34 54 71 102 34 50 03 91 102 34 52 50 38 30 0

运行结果:

Case 1: 1
Case 2: 2
Case 3: 4
Case 4: 1
Case 5: 1
Case 6: -1
Case 7: 3
Case 8: -1
Case 9: 2
Case 10: 1
Case 11: 1
Case 12: -1
Case 13: -1
Case 14: 2
Case 15: 1
Case 16: 1
Case 17: 1
Case 18: -1
Case 19: -1
Case 20: -1
Case 21: 1