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> ...
随机推荐
- SQL函数说明大全 (转)
一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下表给出了T-SQL函数的类别和描 ...
- Wix 安装部署(一)同MSBuild 自动生成打包文件 转
原文地址:http://www.cnblogs.com/stoneniqiu/p/3355086.html 因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不 ...
- PHP之关闭网页错误提示
关闭PHP错误脚本提示是程序上线了必须做的一件事情,就是不管程序怎么报错我们都不能让错误日志在服务器上给大家看到,下面我来总结两种关闭PHP错误脚本提示的具体方法 最简单的办法就是直接在php程序代码 ...
- 如何从软硬件层面提升 Android 动画性能?
若是有人问如何解决动画性能不佳的问题,Dan Lew Codes 总会反问:你是否使用了硬件层? 动画放映过程中每帧画面可能都要重绘.如果使用视图层,,渲染过的视图可以存入离屏缓存以待将来重用,而无需 ...
- ZOJ 2110 Tempter of the Bone(DFS)
点我看题目 题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO. 思路 :DFS一下就可以,不过要注意下一终止条 ...
- 【NOIP 2012 国王游戏】 贪心+高精度
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- codeforces Winner
/* * Winner.cpp * * Created on: 2013-10-13 * Author: wangzhu */ /** * 先找出所有选手的分数和中最大的分数和,之后在所有选手的分数和 ...
- c++ 学习笔记 c++ 引用C库注意点:#ifdef __cplusplus 倒底是什么意思?
时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #en ...
- 乐1/MACBOOK/ N1 Type-C接口新体验
经过在华强北电子市场排队一个小时,笔者顺利买到了期待已久的乐1,结合之前的NOKIA平板电脑N1,苹果全新MACBOOK,终于集齐了手机.平板.笔记本电脑三种TYPE-C接口设备(能兑换极品装备吗?^ ...
- 基于CommentCoreLibrary简单的弹幕实现
本文地址:http://www.cnblogs.com/liaoyu/p/ccl-demo.html 实现基于开源的 CommentCoreLibrary 最近有需求要实现一个简单的评论弹幕实现,通过 ...