POJ 1118(斜率,排序,找到最大的简单方法)
2016-05-19 20:20
190 查看
题意:给出n个点坐标,求最多能有几个点在一条直线上。
思路:需要求每一个点和其余点的斜率。然后排序,找到出现同一个斜率的最多的个数,记着这个数,然后和下一次比较取最大。
要点1:排序注意竖直线没斜率。
要点2:和上一次比较容易出错。
要点3:每个数的初值要注意。
易犯的错误代码:
#include<iostream> #include<algorithm> using namespace std; #include<stdio.h> int main() { int x[705],y[705]; double a[705]; int n; while(scanf("%d",&n) != EOF && n) { int i; for(i = 0;i < n; i++) scanf("%d%d",&x[i],&y[i]); int endnumber = 1; for(i = 0;i < n; i++) { int j,t = 0; for(j = 0;j < n; j++) { if(j == i) continue; if(x[j] == x[i]) a[t++] = 9999999; else a[t++] = ((double)y[j] - y[i])/(x[j] - x[i]); } sort(a,a+t); int sum = 1; for(j = 0;j < t; j++) //一个简便方法去找到最大在一条直线上的数 { if(a[j] == a[j+1]) sum++; else if(sum > endnumber) { endnumber = sum; sum = 1; } } } printf("%d\n",endnumber + 1); } return 0; }
正确代码:
#include<iostream> #include<algorithm> using namespace std; int main() { int x[705],y[705]; double a[705]; int n; while(cin>>n && n != 0) { int i; int endnumber = 1; for(i = 0;i < n; i++) cin>>x[i]>>y[i]; for(i = 0;i < n; i++) { int j,t = 0; for(j = 0;j < n; j++) { if(i == j) continue; if(x[i] == x[j]) a[t++] = 99999999; else a[t++] = ((double(y[j]) - y[i]))/(x[j] - x[i]); } sort(a,a+t); int sum = 1; for(j = 0;j < t; j++) { if(a[j] == a[j+1]) sum++; else { endnumber = endnumber > sum ? endnumber : sum; sum = 1; } } } cout<<endnumber+1<<endl; } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- POJ1050 最大子矩阵和
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)