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> ...
随机推荐
- hdu 2844 poj 1742 Coins
hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...
- PL/SQL — 隐式游标
一.隐式游标的定义及其属性 定义 隐式游标由系统自动定义,非显示定义游标的DML语句即被赋予隐式游标属性.其过程由oracle控制,完全自动化.隐式游标的名称是SQL,不能对SQL游标显式地执行OPE ...
- Hive优化(转)
一.join优化 Join查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边.原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存, ...
- sencha touch json store
js: Ext.define('MyApp.store.MyJsonStore', { extend: 'Ext.data.Store', requires: [ 'MyApp.model.Perso ...
- Ubuntu中PyCharm中字体设置
在Ubuntu安装的PyCharm与Windows不同,除了Editor中的字体.配色需要设置外,文件操作栏(File--Edit--View--Navigate--Code--Refactor--- ...
- 开发安全的Web程序
目录0x1:什么是安全的Web应用程序0x2:过滤输入的数据0x3:转义输出的数据0x4:Register Globals0x5:magic_quotes_gpc0x6:错误信息的报告0x7:文件的安 ...
- 实时时钟、系统时钟和CPU时钟的区别
http://blog.sina.com.cn/s/blog_68f909c30100pli7.html 实时时钟:RTC时钟,用于提供年.月.日.时.分.秒和星期等的实时时间信息,由后备电池供电,当 ...
- LINUX下安装PHP(CGI模式)和NGINX[转]
安装所需依赖 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freety ...
- HTML5文件拖拽
HTML5新增的File API, 可以获取名称.文件大小.类型等信息,需先对DOM中的Element进行拖拽事件绑定 相关API 首先获取节点,绑定拖动到该节点的事件,可以改变鼠标形状 var dr ...
- 一个简单的有向图Java实现
最近看了点有向图的内容,参考开源项目做了一个简单版本,直接贴代码. /** * 有向图接口,定义需要实现的各个方法,可以选择使用邻接矩阵或者邻接链表来实现 * @param <V> V代表 ...