zoj 3720
为什么注释掉的地方是错的? 自己的代码好糟烂.....
直接枚举点 判是否在多边形内 加起来求概率 求面积的时候代码写搓了....
比不过别人两行的代码 而且到现在还找不到错.....
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#define eps 1e-8
#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))
#define zero(x) (((x)>0?(x):-(x))<eps)
#define offset 500
using namespace std;
const int N = 100;
struct point
{
double x, y;
point(double i, double j)
{
x = i, y = j;
}
point() {}
} p[N]; double xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int inside(point q, int n, point *p)
{
int s[3] = {1, 1, 1};
for(int i = 0; i < n && s[1]|s[2]; i++)
s[_sign(xmult(p[(i+1)%n], q, p[i]))] = 0;
return s[1]|s[2];
}
int inside_polygon(point q,int n,point* p)
{
point q2;
int i=0,count;
while (i<n)
for (count=i=0,q2.x=rand()+offset,q2.y=rand()+offset; i<n; i++)
{
if (zero(xmult(q,p[i],p[(i+1)%n]))&&(p[i].x-q.x)*(p[(i+1)%n].x-q.x)<eps
&&(p[i].y-q.y)*(p[(i+1)%n].y-q.y)<eps)
return 1;
else if (zero(xmult(q,q2,p[i])))
break;
else if (xmult(q,p[i],q2)*xmult(q,p[(i+1)%n],q2)<-eps&&
xmult(p[i],q,p[(i+1)%n])*xmult(p[i],q2,p[(i+1)%n])<-eps)
count++;
}
return count&1;
}
int main(void)
{
double x0,y0,xn,yn;
int a,b,n;
while(scanf("%lf%lf%lf%lf",&x0,&y0,&xn,&yn) == 4)
{
int _x0 = ceil(x0), _y0 = ceil(y0), _xn = floor(xn), _yn = floor(yn);
// printf("%d %d %d %d",_x0, _y0, _xn, _yn);
scanf("%d%d%d",&n,&a,&b);
for(int i = 0; i < n; i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
double sum = 0;
for(int i = _x0; i <= _xn; i++)
for(int j = _y0; j <= _yn; j++)
{
if(inside_polygon(point(i, j), n, p))
{
double r=(min(i+0.5,xn)-max(i-0.5,x0))*(min(j+0.5,yn)-max(j-0.5,y0));
sum += r*(i*a+j*b);
// if(i > _x0 && i < _xn && j > _y0 && j < _yn)
// sum += (i*a+j*b);
// else if(i > _x0 && i < _xn && (j == _y0 || j == _yn))
// {
// if(j == _y0)
// sum += (i*a+j*b)*((double)((double)_y0-y0+0.5));
// else
// sum += (i*a+j*b)*((yn-(double)_yn+0.5));
// }
// else if((i == _x0 || i == _xn) && j > _y0 && j < _yn)
// {
// if(i == _x0)
// sum += (i*a+j*b)*(((double)_x0-x0+0.5));
// else
// sum += (i*a+j*b)*((xn-(double)_xn+0.5));
// }
// else
// {
// if(i == _x0 && j == _y0)
// sum += (i*a+j*b)*(((double)_x0-x0+0.5))*(((double)_y0-y0+0.5));
// else if(i == _x0 && j == _yn)
// sum += (i*a+j*b)*(((double)_x0-x0+0.5))*((yn-(double)_yn+0.5));
// else if(i == _xn && j == _y0)
// sum += (i*a+j*b)*((xn-(double)_xn+0.5))*(((double)_y0-y0+0.5));
// else
// sum += (i*a+j*b)*((xn-(double)_xn+0.5))*((yn-(double)_yn+0.5));
// }
}
}
printf("%.3lf\n",(double)sum/(xn-x0)/(yn-y0));
}
return 0;
}
zoj 3720的更多相关文章
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- ZOJ 3686 A Simple Tree Problem
A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a rooted tree, each no ...
- ZOJ Problem Set - 1394 Polar Explorer
这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...
- ZOJ Problem Set - 1392 The Hardest Problem Ever
放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...
- ZOJ Problem Set - 1049 I Think I Need a Houseboat
这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...
- ZOJ Problem Set - 1006 Do the Untwist
今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...
- ZOJ Problem Set - 1001 A + B Problem
ZOJ ACM题集,编译环境VC6.0 #include <stdio.h> int main() { int a,b; while(scanf("%d%d",& ...
- zoj 1788 Quad Trees
zoj 1788 先输入初始化MAP ,然后要根据MAP 建立一个四分树,自下而上建立,先建立完整的一棵树,然后根据四个相邻的格 值相同则进行合并,(这又是递归的伟大),逐次向上递归 四分树建立完后, ...
- ZOJ 1958. Friends
题目链接: ZOJ 1958. Friends 题目简介: (1)题目中的集合由 A-Z 的大写字母组成,例如 "{ABC}" 的字符串表示 A,B,C 组成的集合. (2)用运算 ...
随机推荐
- hdoj1423 最长上升公共子序列
hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...
- CSS之照片翻转
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- Agile.Net 组件式开发平台 - 数据报表组件
Agile.Report.dll 文件为平台数据报表支持库,基于FasstReport.Net扩展重写,提供了非常强大的自定义报表的功能使开发者为应用程序快速有效地生成报表.报表类库提供了创建报表所需 ...
- linux中vsftpd登陆慢卡问题解决方法
1.修改服务器上的/etc/resolv.conf令其内容只有类似 nameserver 192.81.133.229 nameserver 114.114.114.114 出现问题的机器的resol ...
- JavaScript学习笔记(12)——JavaScript内置对象
1.Number Javascript只有一种数字类型,可以有小数也可以没有,也可以使用科学计数法. var z=123e-5; // 0.00123 JavaScript 不是类型语言.与许多其他编 ...
- UGUI之在场景中设置、修改标签和按钮
UnityGUI使用一个特殊的OnGUI()函数,在该函数中加入实现UI的脚本. 它一共有两种类型的接口:GUI.xxx()和GUILayout.xxx(). 第一种需要自动手写填写处于屏幕上的位置. ...
- xposed系列教程
转载说明 本篇文章可能已经更新,最新文章请转:http://www.sollyu.com/xposed-series/ 说明 这是一篇XPOSED开发系列教程, 个人开发者,开发不容易.QQ群: 73 ...
- SVN全量备份+增量备份脚本
一.全量备份 环境:一台主SVN,一台备SVN(主要提供备份功能),后续可通过钩子脚本进行实时备份,后续发给大家. 工作原理:通过svn的hotcopy命令过行热备份,并进行一系列的检查,备份后通过r ...
- 将XML文件保存到DataGridView中
#region get护理单记录信息XML //将XML文件保存到DataTable private DataTable FromXML2DataTable(string XMLStr,string ...
- iOS中为网站添加图标到主屏幕以及增加启动画面
虽然没有能力开发Native App,但还是可以利用iOS中Safari浏览器的特性小小的折腾一下,做一个伪Web App满足下小小的虚荣心的. 既然是在iOS中的Safari折腾的,那么代码中利用到 ...