ZOJ-3720 Magnet Darts 计算几何,概率
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720
题意:在一个矩形区域投掷飞镖,每个整点有磁性,每个点的磁性是一样的,因此飞镖只会落在整点上,投到每个点的得分是:Ax+By。矩形区域里面有个多边形,如果飞镖投在多边形里面则得分,求最终的得分期望。
对于每个点,以它为中心的边长为1的正方形范围内,它都可以把飞镖吸引过来,则最后飞镖能得分的面积就是多边形内以及多边形上所有整点的正方形的面积并,然后期望公式E(X)=p*xi。。
//STATUS:C++_AC_900MS_188KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
//typedef __int64 LL;
//typedef unsigned __int64 ULL;
//const
const int N=;
const int INF=0x3f3f3f3f;
const int MOD=,STA=;
//const LL LNF=1LL<<60;
const double EPS=1e-;
const double OO=1e15;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End struct Node{
double x,y;
}nod[N]; struct DNode{
double x,y;
}ju[]; double A,B;
int n; int chaji(Node &a,Node &b){
return a.x*b.y-b.x*a.y;
} int ponls(Node &a,Node &b,Node &p)
{
if( (p.x==a.x && p.y==a.y) || (p.x==b.x && p.y==b.y) )return ;
Node r1,r2;
r1.x=a.x-b.x,r1.y=a.y-b.y;
r2.x=p.x-b.x,r2.y=p.y-b.y;
if(!chaji(r1,r2) && p.x>=min(a.x,b.x) && p.x<=max(a.x,b.x)
&& p.y>=min(a.y,b.y) && p.y<=max(a.y,b.y))
return ;
return ;
} int quick(Node &l1,Node &l2,Node &r1,Node &r2)
{ if(min(l1.x,l2.x)>max(r1.x,r2.x)
|| min(l1.y,l2.y)>max(r1.y,r2.y)
|| max(l1.x,l2.x)<min(r1.x,r2.x)
|| max(l1.y,l2.y)<min(r1.y,r2.y))
return ;
return ;
} int las(Node &l1,Node &l2,Node &r1,Node &r2)
{
Node a,b,c;
a.x=l1.x-r1.x;
a.y=l1.y-r1.y;
b.x=r2.x-r1.x;
b.y=r2.y-r1.y;
c.x=l2.x-r1.x;
c.y=l2.y-r1.y;
if( ((a.x*b.y)-(b.x*a.y))*((c.x*b.y)-(b.x*c.y))<)return ;
else return ;
} int pinply(int num_node,Node nod[],Node &p)
{
int i,j,cou=;
Node ray;
ray.x=-,ray.y=p.y;
for(i=;i<num_node;i++){
j=(i+)%num_node;
if(ponls(nod[i],nod[j],p))return ;
if(nod[i].y!=nod[j].y){
if(ponls(p,ray,nod[i]) && nod[i].y==max(nod[i].y,nod[j].y))
cou++;
else if(ponls(p,ray,nod[j]) && nod[j].y==max(nod[i].y,nod[j].y))
cou++;
else if(quick(nod[i],nod[j],p,ray) && las(nod[i],nod[j],p,ray)
&& las(p,ray,nod[i],nod[j]))
cou++;
}
}
return cou&;
} bool isonline(int n,Node nod[],Node &p)
{
int i,j;
for(i=;i<n;i++){
if( (p.y-nod[i].y)*(nod[i+].x-nod[i].x)==(nod[i+].y-nod[i].y)*(p.x-nod[i].x)
&& p.x>=Min(nod[i].x,nod[i+].x) && p.x<=Max(nod[i].x,nod[i+].x)
&& p.y>=Min(nod[i].y,nod[i+].y) && p.y<=Max(nod[i].y,nod[i+].y) )return true;
}
if( (p.y-nod[n].y)*(nod[].x-nod[n].x)==(nod[].y-nod[n].y)*(p.x-nod[n].x)
&& p.x>=Min(nod[n].x,nod[].x) && p.x<=Max(nod[n].x,nod[].x)
&& p.y>=Min(nod[n].y,nod[].y) && p.y<=Max(nod[n].y,nod[].y) )return true;
return false;
} double gets(Node &t)
{
double w,h;
w=Min(t.x+0.5,ju[].x)-Max(t.x-0.5,ju[].x);
h=Min(t.y+0.5,ju[].y)-Max(t.y-0.5,ju[].y);
// printf(" %lf %lf\n",w,h);
return h*w;
} int main()
{
// freopen("in.txt","r",stdin);
int i,j;
double ans,S;
Node t;
int min_x,max_x,min_y,max_y;
while(~scanf("%lf%lf%lf%lf",&ju[].x,&ju[].y,&ju[].x,&ju[].y))
{
scanf("%d%lf%lf",&n,&A,&B);
min_x=,max_x=,min_y=,max_y=;
for(i=;i<n;i++){
scanf("%lf%lf",&nod[i].x,&nod[i].y);
min_x=Min(min_x,(int)nod[i].x);
max_x=Max(max_x,(int)nod[i].x);
min_y=Min(min_y,(int)nod[i].y);
max_y=Max(max_y,(int)nod[i].y); }
S=(ju[].x-ju[].x)*(ju[].y-ju[].y); ans=;
for(i=min_x;i<=max_x;i++){
for(j=min_y;j<=max_y;j++){
t.x=i,t.y=j;
if(pinply(n,nod,t) || isonline(n-,nod,t)){
ans+=(A*i+B*j)*gets(t);
}
}
} printf("%.3lf\n",ans/S);
}
return ;
}
ZOJ-3720 Magnet Darts 计算几何,概率的更多相关文章
- ZOJ3720 Magnet Darts(点在多边形内)
第一道点在多边形内的判断题,一开始以为是凸的.其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内. 如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了.但对 ...
- zoj 3720
为什么注释掉的地方是错的? 自己的代码好糟烂..... 直接枚举点 判是否在多边形内 加起来求概率 求面积的时候代码写搓了.... 比不过别人两行的代码 而且到现在还找不到错 ...
- zoj 3640 Help Me Escape 概率DP
记忆化搜索+概率DP 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include ...
- zoj 3329 One Person Game 概率DP
思路:这题的递推方程有点麻烦!! dp[i]表示分数为i的期望步数,p[k]表示得分为k的概率,p0表示回到0的概率: dp[i]=Σ(p[k]*dp[i+k])+dp[0]*p0+1 设dp[i]= ...
- zoj 3640 Help Me Escape (概率dp 递归求期望)
题目链接 Help Me Escape Time Limit: 2 Seconds Memory Limit: 32768 KB Background If thou doest w ...
- ZOJ 1696 Viva Confetti 计算几何
计算几何:按顺序给n个圆覆盖.问最后能够有几个圆被看见.. . 对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这 ...
- ZOJ 3329 One Person Game 概率DP 期望 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754 本题分数为0的概率不确定,所以不能从0这端出发. 设E[i]为到达成功所 ...
- ZOJ 3329-One Person Game(概率dp,迭代处理环)
题意: 三个色子有k1,2,k3个面每面标号(1-k1,1-k2,1-k3),一次抛三个色子,得正面向上的三个编号,若这三个标号和给定的三个编号a1,b1,c1对应则总和置零,否则总和加上三个色子标号 ...
- ZOJ 2675 Little Mammoth(计算几何)
圆形与矩形截面的面积 三角仍然可以做到这一点 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> ...
随机推荐
- 教育O2O在学校落地,学堂在线瞄准混合式教学
(大讲台—国内首个it在线教育混合式自适应学习平台.) 进入2015年,互联网教育圈最火的词非“教育O2O”莫属.不断刷新的融资金额和速度,不断曝光的正面和负面新闻,都让教育O2O公司赚足了眼球.然并 ...
- 3.MVC框架开发(Razor内嵌函数)
1.建立没有返回值的Razor内嵌函数(但是能直接输出内容) 必须以@符号开头,没有返回值但能直接输出内容,比如: @helper showTitle(string strTitle){ ){ @(s ...
- 关于JAVA面向对象基础整理以及个人的理解(适合初学者阅读)
JAVA的基础语法等都跟C有很大的相似之处,所以这里就不多啰嗦了.直接从数组开始. 数组: 1.声明 int [] a; 在声明的过程中,并没有分配空间给数组.我们可以在声明的同时,用new来分配相应 ...
- 制作第一个UI图集
按钮分有两种形式,一种是普通按钮,也就是一张没有文字的按钮图片,在需要用时,就在上面写上不同的.当前所需要的文字.量一种按钮则是图片按钮,这种按钮的特点是整个按钮就是一张图片,它既是按钮也是图片. 在 ...
- OpenGL ES 3.0 基础知识
首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...
- linux删除某类型文件的命令
使用linux命令行,删除某目录下某类型的文件,如:删除.rar结尾的所有文件. 命令如下: find . -name "*.rar" -type f -print -exec r ...
- yum安装软件时提示软件包没有签名
yum install [XXX] -y --nogpgcheck
- Google考虑抛弃Cookies机制
根据华尔街日报的报道,Google 正在考虑抛弃古老的浏览器 cookies 来追踪用户信息的机制.作为替代,Google 将开发一种「个人匿名标识机制」.Google 早前已经计划在 IE 和 iP ...
- hdu 3483 A Very Simple Problem
两种构造的方式都是正确的: 1. #include<cstdio> #include<cstring> #include<algorithm> #define ma ...
- unity Android 打包后读取 xml 文件
原地址:http://www.cnblogs.com/wuzhang/p/wuzhang20140731.html 问题: 前天在做东西的过程中发现了一个让人很纠结的问题,为什么Unity 程序 ...