hdu4353 Finding Mine三角形内的点数

http://acm.hdu.edu.cn/showproblem.php?pid=4353

题意:

  求多边形面积和这个多边形内的金矿数的比值的最小值。

  当xi<xj<xk时:

  三角形内的点数=|ik上方的点-(ij上方的点+jk上方的点)|

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <algorithm>

 4 using namespace std;

 5 const int Ni = 205;

 6 const int Mi = 505;

 7 int n,m;

 8 double mx;

 9 struct node{

10     int x,y;//注意数据的范围,是否超int

11     bool operator < (const node &a) const

12     {

13         return x<a.x;

14     }

15 }a[Ni],b[Mi];

16 int sum[Ni][Ni];

17 inline double fabs(double a)

18 {

19     if(a>1e-8) return a;

20     if(-a>1e-8) return -a;

21     return 0;

22 }

23 bool cross(int i,int j,int k)

24 {

25     if(0<(a[j].x-a[i].x)*(b[k].y-a[i].y)-(a[j].y-a[i].y)*(b[k].x-a[i].x))

26         return 1;

27     else return 0;

28 }

29 inline int area(int i,int j,int k)

30 {

31     return (a[j].x-a[i].x)*(a[k].y-a[i].y)-(a[j].y-a[i].y)*(a[k].x-a[i].x);

32 }

33 inline bool judge(int i,int j,int k)

34 {

35     if(a[i].x<b[k].x&&b[k].x<=a[j].x){

36         if(cross(i,j,k)) return 1;

37     }

38     return 0;

39 }

40 void finds()

41 {

42     int i,j,k;

43     for(i=0;i<n;i++)

44     for(j=i+1;j<n;j++)

45     {

46         sum[i][j]=0;

47         for(k=0;k<m;k++) if(judge(i,j,k))

48             sum[i][j]++;

49     }

50     mx=1<<27;

51     for(i=0;i<n;i++)

52     for(j=i+1;j<n;j++)

53     for(k=j+1;k<n;k++)

54     {

55         int ans=sum[i][k]-sum[i][j]-sum[j][k];

56         double s=area(i,j,k);

57         if(ans&&(s=fabs(s/ans))<mx)

58         {

59              mx=s;

60         }

61     }

62 }

63 int main()

64 {

65     int cs=1,tcs,i;

66     scanf("%d",&tcs);

67     while(tcs--)

68     {

69         scanf("%d%d",&n,&m);

70         for(i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);

71         sort(a,a+n);

72         for(i=0;i<m;i++) scanf("%d%d",&b[i].x,&b[i].y);

73         finds();

74         if(mx!=1<<27)

75             printf("Case #%d: %lf\n",cs++,mx/2);

76         else

77             printf("Case #%d: -1\n",cs++);

78     }

79     return 0;

80 }

 

你可能感兴趣的:(find)