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)用运算 ...
随机推荐
- Android 如何监听返回键,弹出一个退出对话框
android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...
- 日入过百优质消除手游数据分享—萌萌哒包子脸爱消除(游戏开发引擎:libgdx)
从2014年开始,消除游戏异常火爆,从消除小星星到腾讯的天天消除都赢得了海量用户.目前,各大市场上开心消消乐等游戏依旧火爆.消除游戏一直持续保持着女性和孩子的主流游戏地位.虽然市场上消除游戏种类很多, ...
- 第六十二篇、AFN3.0封装网络请求框架,支持缓存
1.网络请求 第一种实现方式: 功能:GET POST 请求 缓存逻辑: 1.是否要刷新本地缓存,不需要就直接发起无缓存的网络请求,否则直接读取本地数据 2.需要刷新本地缓存,先读取本地数据,有就返回 ...
- MLlearning(2)——simHash算法
这篇文章主要讲simHash算法.这是一种LSH(Locality-Sensitive Hashing,局部敏感哈希)的简单实现.它是广泛用于数据去重的算法,可以用于相似网站.图片的检索.而且当两个样 ...
- jquery学习全面总结
本文仅针对jquery的部分知识点做总结,更为全面的可以去官网看中文文档.可以更为详细的了解jquery及其特性. window.onload 和$(document).ready() 我 windo ...
- 关于mysql group_concat 不能显示为空的列的其他信息
今天做项目遇到一个问题,百度好久都没找到问题所在 是酱紫的,一张表 关联的表 然后我用sql语句查询 point.pid,point.pname,GROUP_CONCAT(downsite.pname ...
- must implement the inherited abstract method DialogInterface.OnClickListener.onClick(DialogInterface, int)问题
依照视屏编写代码如下 class MyButtonListener implements OnClickListener{ @Override public void onClick(View v){ ...
- Git快速上手 : Tortoise工具使用
利用工具快速上手Git 别跟我说什么用命令操作Git,多高大上呀,请不要在这里跟我装逼,就如同,有个小妞在床上眉眼诱惑地,你却TM还要先看个片儿来热热身.... TortoiseGit 名字看着眼熟 ...
- BroadcastReceiver
BroadcastReceiver 广播接受者 Android中, Broadcast是一种数据传递的方式/通信方式. Brodadcast 是Android 系统组件之一 广播的特性 1. 由一个发 ...
- eclipse 分屏
刚刚一直找不到eclipse分屏功能,查了下发现是可以的. 具体见:http://www.coderanch.com/t/101996/vc/Split-screen-editor-Eclipse E ...