• ZOJ-3720 Magnet Darts 计算几何,概率


      题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720

      题意:在一个矩形区域投掷飞镖,每个整点有磁性,每个点的磁性是一样的,因此飞镖只会落在整点上,投到每个点的得分是:Ax+By。矩形区域里面有个多边形,如果飞镖投在多边形里面则得分,求最终的得分期望。

      对于每个点,以它为中心的边长为1的正方形范围内,它都可以把飞镖吸引过来,则最后飞镖能得分的面积就是多边形内以及多边形上所有整点的正方形的面积并,然后期望公式E(X)=p*xi。。

      1 //STATUS:C++_AC_900MS_188KB
      2 #include <functional>
      3 #include <algorithm>
      4 #include <iostream>
      5 //#include <ext/rope>
      6 #include <fstream>
      7 #include <sstream>
      8 #include <iomanip>
      9 #include <numeric>
     10 #include <cstring>
     11 #include <cassert>
     12 #include <cstdio>
     13 #include <string>
     14 #include <vector>
     15 #include <bitset>
     16 #include <queue>
     17 #include <stack>
     18 #include <cmath>
     19 #include <ctime>
     20 #include <list>
     21 #include <set>
     22 #include <map>
     23 using namespace std;
     24 //using namespace __gnu_cxx;
     25 //define
     26 #define pii pair<int,int>
     27 #define mem(a,b) memset(a,b,sizeof(a))
     28 #define lson l,mid,rt<<1
     29 #define rson mid+1,r,rt<<1|1
     30 #define PI acos(-1.0)
     31 //typedef
     32 //typedef __int64 LL;
     33 //typedef unsigned __int64 ULL;
     34 //const
     35 const int N=35;
     36 const int INF=0x3f3f3f3f;
     37 const int MOD=100000,STA=8000010;
     38 //const LL LNF=1LL<<60;
     39 const double EPS=1e-8;
     40 const double OO=1e15;
     41 const int dx[4]={-1,0,1,0};
     42 const int dy[4]={0,1,0,-1};
     43 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
     44 //Daily Use ...
     45 inline int sign(double x){return (x>EPS)-(x<-EPS);}
     46 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
     47 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
     48 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
     49 template<class T> inline T Min(T a,T b){return a<b?a:b;}
     50 template<class T> inline T Max(T a,T b){return a>b?a:b;}
     51 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
     52 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
     53 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
     54 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
     55 //End
     56 
     57 struct Node{
     58     double x,y;
     59 }nod[N];
     60 
     61 struct DNode{
     62     double x,y;
     63 }ju[2];
     64 
     65 double A,B;
     66 int n;
     67 
     68 int chaji(Node &a,Node &b){
     69     return a.x*b.y-b.x*a.y;
     70 }
     71 
     72 int ponls(Node &a,Node &b,Node &p)
     73 {
     74     if( (p.x==a.x && p.y==a.y) || (p.x==b.x && p.y==b.y) )return 2;
     75     Node r1,r2;
     76     r1.x=a.x-b.x,r1.y=a.y-b.y;
     77     r2.x=p.x-b.x,r2.y=p.y-b.y;
     78     if(!chaji(r1,r2) && p.x>=min(a.x,b.x) && p.x<=max(a.x,b.x)
     79         && p.y>=min(a.y,b.y) && p.y<=max(a.y,b.y))
     80         return 1;
     81     return 0;
     82 }
     83 
     84 int quick(Node &l1,Node &l2,Node &r1,Node &r2)
     85 {
     86 
     87     if(min(l1.x,l2.x)>max(r1.x,r2.x)
     88         || min(l1.y,l2.y)>max(r1.y,r2.y)
     89         || max(l1.x,l2.x)<min(r1.x,r2.x)
     90         || max(l1.y,l2.y)<min(r1.y,r2.y))
     91         return 0;
     92     return 1;
     93 }
     94 
     95 int las(Node &l1,Node &l2,Node &r1,Node &r2)
     96 {
     97     Node a,b,c;
     98     a.x=l1.x-r1.x;
     99     a.y=l1.y-r1.y;
    100     b.x=r2.x-r1.x;
    101     b.y=r2.y-r1.y;
    102     c.x=l2.x-r1.x;
    103     c.y=l2.y-r1.y;
    104     if( ((a.x*b.y)-(b.x*a.y))*((c.x*b.y)-(b.x*c.y))<0)return 1;
    105     else return 0;
    106 }
    107 
    108 int pinply(int num_node,Node nod[],Node &p)
    109 {
    110     int i,j,cou=0;
    111     Node ray;
    112     ray.x=-1,ray.y=p.y;
    113     for(i=0;i<num_node;i++){
    114         j=(i+1)%num_node;
    115         if(ponls(nod[i],nod[j],p))return 0;
    116         if(nod[i].y!=nod[j].y){
    117             if(ponls(p,ray,nod[i]) && nod[i].y==max(nod[i].y,nod[j].y))
    118                 cou++;
    119             else if(ponls(p,ray,nod[j]) && nod[j].y==max(nod[i].y,nod[j].y))
    120                 cou++;
    121             else if(quick(nod[i],nod[j],p,ray) && las(nod[i],nod[j],p,ray)
    122                 && las(p,ray,nod[i],nod[j]))
    123                 cou++;
    124         }
    125     }
    126     return cou&1;
    127 }
    128 
    129 bool isonline(int n,Node nod[],Node &p)
    130 {
    131     int i,j;
    132     for(i=0;i<n;i++){
    133         if( (p.y-nod[i].y)*(nod[i+1].x-nod[i].x)==(nod[i+1].y-nod[i].y)*(p.x-nod[i].x)
    134            && p.x>=Min(nod[i].x,nod[i+1].x) && p.x<=Max(nod[i].x,nod[i+1].x)
    135            && p.y>=Min(nod[i].y,nod[i+1].y) && p.y<=Max(nod[i].y,nod[i+1].y) )return true;
    136     }
    137     if( (p.y-nod[n].y)*(nod[0].x-nod[n].x)==(nod[0].y-nod[n].y)*(p.x-nod[n].x)
    138        && p.x>=Min(nod[n].x,nod[0].x) && p.x<=Max(nod[n].x,nod[0].x)
    139        && p.y>=Min(nod[n].y,nod[0].y) && p.y<=Max(nod[n].y,nod[0].y) )return true;
    140     return false;
    141 }
    142 
    143 double gets(Node &t)
    144 {
    145     double w,h;
    146     w=Min(t.x+0.5,ju[1].x)-Max(t.x-0.5,ju[0].x);
    147     h=Min(t.y+0.5,ju[1].y)-Max(t.y-0.5,ju[0].y);
    148 //    printf("  %lf %lf
    ",w,h);
    149     return h*w;
    150 }
    151 
    152 int main()
    153 {
    154  //   freopen("in.txt","r",stdin);
    155     int i,j;
    156     double ans,S;
    157     Node t;
    158     int min_x,max_x,min_y,max_y;
    159     while(~scanf("%lf%lf%lf%lf",&ju[0].x,&ju[0].y,&ju[1].x,&ju[1].y))
    160     {
    161         scanf("%d%lf%lf",&n,&A,&B);
    162         min_x=510,max_x=0,min_y=510,max_y=0;
    163         for(i=0;i<n;i++){
    164             scanf("%lf%lf",&nod[i].x,&nod[i].y);
    165             min_x=Min(min_x,(int)nod[i].x);
    166             max_x=Max(max_x,(int)nod[i].x);
    167             min_y=Min(min_y,(int)nod[i].y);
    168             max_y=Max(max_y,(int)nod[i].y);
    169 
    170         }
    171         S=(ju[1].x-ju[0].x)*(ju[1].y-ju[0].y);
    172 
    173         ans=0;
    174         for(i=min_x;i<=max_x;i++){
    175             for(j=min_y;j<=max_y;j++){
    176                 t.x=i,t.y=j;
    177                 if(pinply(n,nod,t) || isonline(n-1,nod,t)){
    178                     ans+=(A*i+B*j)*gets(t);
    179                 }
    180             }
    181         }
    182 
    183         printf("%.3lf
    ",ans/S);
    184     }
    185     return 0;
    186 }
  • 相关阅读:
    自我介绍
    自动生成小学生四则运算(C语言)
    黄金点游戏
    7/5linux命令(整理中)
    第二章内容及作业
    第三章笔记
    第一章作业
    第一阶段笔记整理7.23
    第三章课后作业
    7/6linux命令
  • 原文地址:https://www.cnblogs.com/zhsl/p/3207776.html
Copyright © 2020-2023  润新知