poj 2780 Linearity 【高效版 同一條直線上的點】
這道題才真的沒有那麼的水,可能因為測試數據很多,然後又每個數據有1000個點要處理,用O(n^3)的三重循環直接TLE掉了。。。
所以得另想辦法,後來參考了一下別人的想法,得用極角排序,一個sort()就可以了,極角為0的因為無法做分母,所以得單獨考慮,終於AC。。。
AC的代碼:
#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int x[1002],y[1002]; int main() { int n; int i,j,k,max; while(scanf("%d",&n)!=EOF) { //輸入 for(i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); max=2; //每次循環都判斷 for(k=1;k<=n;k++) { int count1=1; double angle[1002]; int zero=0; for(i=1;i<=n;i++) { //單獨處理分母為0的情況 if(x[i]-x[k]==0) zero++; else angle[count1++]=(double)(y[i]-y[k])/(double)(x[i]-x[k]); } //按極角的大小進行排序 sort(&angle[1],&angle[count1]); //看排序的裏麵有幾個連續的數 int temp=2; int sum=2; double pos=angle[1]; for(i=2;i<count1;i++) { //是相同的就count++ if(pos==angle[i]) sum++; //否則就重頭開始計數 else { pos=angle[i]; if(sum>temp) temp=sum; sum=2; } } if(temp>max) max=temp; if(zero>max) max=zero; } printf("%d\n",max); } return 0; }
TLE的代碼:
#include <stdio.h> int x[1002],y[1002]; int main() { int n; while(scanf("%d",&n)!=EOF) { int i; //輸入坐標點的值 for(i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); //暴搜開始 int count,max=-1; int j,k; for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { count=2; for(k=j+1;k<=n;k++) if((y[i]-y[k])*(x[j]-x[k])==(y[j]-y[k])*(x[i]-x[k])) count++; if(max<count) max=count; } printf("%d\n",max); } return 0; }
最後更新:2017-04-03 14:53:48