poj 1118 Lining Up

 

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2010/05/14/5593259.aspx

 

http://acm.pku.edu.cn/JudgeOnline/problem?id=1118

 

类型: 暴力

 

题意: 给出n个点的整数坐标(n<=700),求一条直线,使得在这条直线上的点数最多,输出点数

 

思路: 枚举每个点和其他点的斜率,记录在数组中,如果两个点都在水平线上,则斜率为无穷大,遍历保存斜率的数组,如果前一个斜率和后一个一样计数器加一,并刷新最大值,否则为两个点

 

#include #include #include using namespace std; int a[702][2]; float b[702]; int main(){ int n, i, max, j, k, cnt, num; while(cin>>n && n != 0){ memset(a, 0, sizeof(a)); for(i = 0; i < n; i++) cin>>a[i][0]>>a[i][1]; max = 2; for(i = 0; i < n-1; i++){ cnt = 0; num = 2; for(j = i + 1; j < n; j++){ if(a[i][0] == a[j][0]) b[cnt++] = 32767; else b[cnt++] = (float)(a[j][1]-a[i][1])/(float)(a[j][0]-a[i][0]); } sort(b, b+cnt); for(k = 1; k <= cnt; k++){ if(b[k-1] == b[k]){ num++; if(num > max) max = num; } else num = 2; } } cout<

你可能感兴趣的:(poj 1118 Lining Up)