poj 2318 与 poj 2398计算几何 叉乘积运用
来源:互联网 发布:空间大师软件效果图 编辑:程序博客网 时间:2024/05/17 22:27
原文链接
给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数。
解答:对每个玩具,二分线段下标,判断在线段左边还是右边,找到之后进行统计即可
#include<stdio.h>#include<iostream>#include<math.h>#include<string.h>using namespace std;#define MAX 5010struct Point{ int x; int y;}p1[MAX], p2[MAX],t[MAX];int num[MAX];int Area2(Point p2, Point p3, Point p1){ int temp = (p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x) * (p2.y - p1.y); return temp;}void Bsearch(Point a, int n){ int l, r, mid; l = 1; r = n; //l从1开始 while (l < r) { mid = (l + r) >> 1; if (Area2(p1[mid], p2[mid], a) > 0) { l = mid + 1; } else { r = mid; } } if (Area2(p1[l], p2[l], a) < 0) { num[l - 1]++; } else { num[l]++; }}int main(){ //freopen("E:\input.txt", "r", stdin); int m; int n; int i, j; Point point1, point2; while ((scanf("%d%d", &n, &m)) && n != 0) { memset(p1, 0, sizeof(p1)); memset(p2, 0, sizeof(p2)); memset(t, 0, sizeof(t)); memset(num, 0, sizeof(num)); scanf("%d%d%d%d", &point1.x, &point1.y, &point2.x, &point2.y); for(i = 1; i <= n; i++) { scanf("%d%d", &p1[i].x, &p2[i].x); p1[i].y = point1.y; p2[i].y = point2.y; } for (j = 0; j < m; j++) { scanf("%d%d", &t[j].x, &t[j].y); Bsearch(t[j], n); } for (i = 0; i <= n; i++) { printf("%d: %d\n", i, num[i]); } printf("\n"); } return 0;}
参考BLOG:poj2318
升级版:POJ2398
只是中间的n个隔板未排序,输出的是装有i个玩具的区域的个数,其他完全一样
#include<stdio.h>#include<iostream>#include<algorithm>#include<math.h>#include<string.h>using namespace std;#define MAX 1010struct Point{ int x; int y;}p1[MAX], p2[MAX],t[MAX];struct Line{ Point po1; Point po2;}L[MAX];int num[MAX], num1[MAX];bool cmp(Line a, Line b){ return a.po1.x < b.po1.x;}int Area2(Point p2, Point p3, Point p1){ int temp = (p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x) * (p2.y - p1.y); return temp;}void Bsearch(Point a, int n){ int l, r, mid; l = 1; r = n; //l从1开始 while (l < r) { mid = (l + r) >> 1; if (Area2(L[mid].po1, L[mid].po2, a) > 0) { l = mid + 1; } else { r = mid; } } if (Area2(L[l].po1, L[l].po2, a) < 0) { num[l - 1]++; } else { num[l]++; }}int main(){ freopen("E:\input.txt", "r", stdin); int m; int n; int i, j; Point point1, point2; while ((scanf("%d%d", &n, &m)) && n != 0) { memset(p1, 0, sizeof(p1)); memset(p2, 0, sizeof(p2)); memset(t, 0, sizeof(t)); memset(num, 0, sizeof(num)); memset(num1, 0, sizeof(num1)); scanf("%d%d%d%d", &point1.x, &point1.y, &point2.x, &point2.y); for(i = 1; i <= n; i++) { scanf("%d%d", &p1[i].x, &p2[i].x); L[i].po1.x = p1[i].x; L[i].po2.x = p2[i].x; L[i].po1.y = point1.y; L[i].po2.y = point2.y; } sort(L, L + n + 1, cmp); for (j = 0; j < m; j++) { scanf("%d%d", &t[j].x, &t[j].y); Bsearch(t[j], n); } for (i = 0; i <= n; i++) { if (num[i]) { num1[num[i]]++; } } printf("Box\n"); for (i = 1; i <= m; i++) { if (num1[i]) { printf("%d: %d\n", i, num1[i]); } } //printf("\n"); } return 0;}
参考BLOG:
poj2318 poj2398
0 0
- poj 2318 与 poj 2398计算几何 叉乘积运用
- POJ 2318 2398 计算几何
- 【计算几何】POJ 2318 & POJ 2398
- poj 1654(计算几何)(差乘运用)
- POJ 2318(计算几何 )
- POJ 2318 计算几何 叉积水题
- poj 2318 计算几何叉积
- poj 2318(计算几何) 叉乘
- POJ 2318:TOYS & POJ 2398:Toy Storage 计算几何
- poj 2398 (计算几何)
- POJ 2318 计算几何 叉积
- poj-2318-TOYS-计算几何
- POJ 2318 计算几何+二分
- POJ 2318 TOYS(计算几何)
- poj 2318(计算几何)
- poj 2318 TOYS (计算几何)
- POJ 2318 计算几何 题解
- 计算几何--POJ--2318--TOYS
- 获取java项目根目录
- 一张图彻底了解Unity脚本的生命周期
- Linux系统性能测试与分析2-性能检测
- Kafka剖析(一):Kafka背景及架构介绍
- web项目不能部署到tomcat里面解决办法
- poj 2318 与 poj 2398计算几何 叉乘积运用
- iozone测试文件系统
- UML用例图总结
- Kafka设计解析(二):Kafka High Availability (上)
- SAP成本核算相关金额流转凭证
- js中splice()
- 支持连接池和结果集缓存的MySQL数据库JDBC通用框架的轻量级封装(一)——粗略实现
- 置换的玩笑(搜索)(中等)(计蒜之道 测试赛 c)
- 开源大数据查询分析引擎现状