POJ 1265 Area
来源:互联网 发布:网吧告计费软件 编辑:程序博客网 时间:2024/05/17 08:26
题目大意:
给一个平面上的简单多边形,求边上的点,多边形内的点,多边形面积。
解题思路:
这个题用了很多知识点:
1、以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数。如果dx或dy为0,则覆盖的点数为dy或dx。
2、Pick公式:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1。
3、任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和。
只要知道了这些,代码很好写,注意细节就行了。
解析copy的脑残得孩子慢慢学的
#include <iostream>#include <cstdio>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct node{ int x, y;}point[1100];double area(node a, node b){ return a.x*b.y-a.y*b.x;}int gcd(int a, int b){ return b?gcd(b,a%b):a;}int main(){ int t; cin >> t; int cnt = 1; while(t--){ int n; scanf("%d", &n); point[0].x = 0; point[0].y = 0; double sum = 0.0; int dx, dy; int p = 0; for(int i = 1;i <= n;i++){ scanf("%d %d", &point[i].x, &point[i].y); dx = point[i].x; if(dx < 0) dx = -dx; dy = point[i].y; if(dy < 0) dy = -dy; p+= gcd(dx,dy); point[i].x+=point[i-1].x; point[i].y+=point[i-1].y; sum+=area(point[i],point[i-1]); } if(sum < 0) sum = -sum; sum/=2; printf("Scenario #%d:\n", cnt); printf("%d %d %.1f\n\n", (int)(sum+1-p/2), p, sum); cnt++; } return 0;}
0 0
- Poj 1265 Area
- poj 1265 Area
- POJ 1265 Area
- poj 1265 Area
- POJ 1265 Area
- POJ 1265 Area
- POJ 1265 Area
- POJ 1265 Area
- poj 1265 Area
- POJ 1265:Area
- POJ 1265 Area
- POJ 1265 Area
- poj 1265 Area
- poj-1265 Area
- poj 1265 Area
- POJ 1265 Area
- POJ 1265 Area
- poj 1265 Area
- 基于Java Socket的自定义协议,实现Android与服务器的长连接(一)
- bzoj3998 [TJOI2015]弦论
- centos7启动Genymotion时报错,`CXXABI_1.3.8' not found和`GLIBCXX_3.4.20' not found,解决方案
- 用Excel VBA代码实现去重录入某字段内容
- Oracle 12c JDBC 连接
- POJ 1265 Area
- Android-startActivityForResult用法
- iOS 抽屉效果实现
- 两数之和(二)
- 火狐浏览器打开百度网页时,提示"您的连接不安全"怎么办
- Golang编程经验
- lightoj1062【几何(二分)】
- 生成函数
- 分布式消息队列Kafka集群安装