UVa 270 & POJ 1118 - Lining Up
2013-07-22 12:33
357 查看
题目大意:给一些点,找出一条直线使尽可能多的点在这条直线上,求这条直线上点的个数。
以每一个点为原点进行枚举,求其它点的斜率,斜率相同则说明在一条直线上。对斜率排序,找出斜率连续相等的最大长度。
View Code
开始WA了两次,各种纠结,也找不出什么问题,忽然想到会不会是精度设的太大了,从10e-6改成10e-9,然后抱着侥幸心理提交了,竟然AC了...这个...算是积累经验吧
以每一个点为原点进行枚举,求其它点的斜率,斜率相同则说明在一条直线上。对斜率排序,找出斜率连续相等的最大长度。
#include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define MAXN 700+10 #define PRECISION 10e-9 struct Point { int x, y; }; Point point[MAXN]; double slope[MAXN]; int main() { #ifdef LOCAL freopen("in", "r", stdin); #endif int N; scanf("%d", &N); char s[100]; getchar(); gets(s); while (N--) { int n = 0; // the number of points while (gets(s)) { if (s[0] == '\0') break; sscanf(s, "%d%d", &point .x, &point .y); n++; } int ans = 0; for (int i = 0; i < n; i++) { int zero_cnt = 0, k = 0; for (int j = 0; j < n; j++) if (i != j) { if (point[i].x == point[j].x) zero_cnt++; else { slope[k] = 1.0 * (point[j].y - point[i].y) / (point[j].x - point[i].x); k++; } } sort(slope, slope+k); int same_cnt = 1, maxl = 1; for (int i = 1; i <= k; i++) { if (i < k && fabs(slope[i] - slope[i-1]) < PRECISION) { same_cnt++; } else { maxl = max(maxl, same_cnt); same_cnt = 1; } } maxl = max(maxl, zero_cnt); ans = max(ans, maxl+1); } printf("%d\n", ans); if (N) printf("\n"); } return 0; }
View Code
开始WA了两次,各种纠结,也找不出什么问题,忽然想到会不会是精度设的太大了,从10e-6改成10e-9,然后抱着侥幸心理提交了,竟然AC了...这个...算是积累经验吧
相关文章推荐
- uva 270 Lining Up/poj 1118
- poj&nbsp;1118&nbsp;Lining&nbsp;Up&nbsp;哈希
- POJ 1118 && HDU 1432 Lining Up(计算几何)
- UVa 270 / POJ 1118 Lining Up (计算几何)
- [排序&&模拟]Lining Up uva270
- POJ 1118 Lining Up && POJ 2606 Rabbit hunt 找出一条直线上的点的最大个数
- POJ 1118 Lining Up && POJ 2606 Rabbit hunt 找出一条直线上的点的最大个数
- UVA270-Lining Up
- POJ 1118 Lining Up
- UVA - 270 Lining Up
- HDU 1432 Lining Up (POJ 1118)
- POJ 1118 Lining Up
- POJ_1118_Lining Up
- UVA 270 Lining Up (几何 判断共线点)
- poj 1118 Lining Up(水题)
- poj 1118 Lining Up(暴力+数学)
- POJ 1118 Lining Up(我的水题之路——斜率最多)
- POJ 1018 & HDU 1432 Lining Up 【简单几何】
- UVA - 270 Lining Up
- uva 270 Lining Up(暴力+ 几何)