ZOJ-1041
2014-01-01 20:07
351 查看
主要是几何知识,先排除那些圆外的点,对于圆内的点,遍历每个点,和圆心连成直线,然后判断其他点在直线上或直线下或者被直线经过,统计直线上下点最多的情况
#include<stdio.h> #include<math.h> #include<stdlib.h> struct point { int x; int y; }; typedef struct point *ptr; int squareD(int x1, int y1, int x2, int y2) { return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); } int horl(int ox, int oy, int px, int py, int x, int y) { return (py - oy) * x + (px * oy - ox * py) - y * (px - ox); } int main() { int ox, oy; double r; while (scanf("%d %d %lf", &ox, &oy, &r), r >= 0) { int n, x, y, total = 0; ptr array; scanf("%d", &n); array = (ptr) malloc(n * sizeof(struct point)); while (n--) { scanf("%d %d", &x, &y); if (squareD(ox, oy, x, y) > r * r) continue; (array + total)->x = x; (array + total)->y = y; total++; } int i, j, r, high, low, result = 0, max; for (i = 0; i < total; i++) { high = 0, low = 0; for (j = 0; j < total; j++) { r = horl(ox, oy, (array + i)->x, (array + i)->y, (array + j)->x, (array + j)->y); if (r >= 0) high++; if (r <= 0) low++; } max = high > low ? high : low; if (max > result) result = max; } printf("%d\n", result); free(array); } return 0; }
相关文章推荐
- ZOJ 1041 Transmitters
- ZOJ 1041(POJ 1106) Transmitters(…
- zoj 1041 || poj 1106 Transmitters
- ZOJ Problem Set - 1041
- ZOJ 1041 Transmitters
- zoj 1041 Transmitters
- zoj 1041_Transmitters_计算几何
- [ZOJ1041] Transmitters
- zoj 1041 || poj 1106
- zoj 1041 水题
- ZOJ-1041-Transmitters
- ZOJ1041 Transmitters
- ZOJ 1041 Transmitters(计算几何)
- ZOJ 1041 Transmitters
- ZOJ1041 Transmitters
- [ACM_几何] Transmitters (zoj 1041 ,可旋转半圆内的最多点)
- ZOJ 1041 Transmitters
- ZOJ1041-Transmitters(叉乘)
- zoj 1041 Transmitters
- zoj1041 Transmitters