1. 程式人生 > >C語言 poj1328題

C語言 poj1328題

島嶼以d為半徑做圓,與x軸的兩個交點構成一條線段,能夠掃到該島嶼的雷達一定在該線段上,將所有的線段按左端點大小從左到右排序,若前一個島嶼的右端點比後一個島嶼的左端點大,則兩個島嶼能共用一個雷達,否則不能,雷達數+1,若能共用,則下一次作為判斷標準的是前兩個可以共用的島嶼右端點更小的島嶼位置。 該題已經在北大ACM網站提交通過

# include<stdio.h>
# include<math.h> 
typedef struct
{
    double left;
    double right;
}island;

int main()
{
    island position[1000
],temp,p; int n,d,count,order=0; // count多少個島嶼,order第幾個case int x,y,i,j,flag,min; //flag=1輸出-1 double m; while(1) { flag=0; count=0; scanf("%d %d",&n,&d); if(n==0&&d==0) break; if
(d<0||n<0) flag=1; for(i=0;i<n;i++) { scanf("%d %d",&x,&y); if(y<0||y>d) flag=1; else { m=d*d-y*y; position[i].left=x-sqrt(m); position[i].right=x+sqrt
(m); // sqrt的引數是double或者float型 } } order++; printf("Case %d: ",order); if(flag==1) { printf("%d\n",-1); continue; } count=1; for(i=0;i<n;i++) //從左到右排序 { min=i; for(j=i+1;j<n;j++) if(position[min].left>position[j].left) min=j; if(min!=i) { temp=position[i]; position[i]=position[min]; position[min]=temp; } } if(n==1&&y<=d) count=1; p=position[0]; for(i=1;i<n;i++) // p上一個島 { if(p.right<position[i].left) { count++; p=position[i]; } else { if(p.right>position[i].right) p=position[i]; } } printf("%d\n",count); } }