閱讀223 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go [曆年IT筆試題]2014歡聚時代校園招聘筆試題
  下一篇:go Android交互體驗必知:功能按鍵事件