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;
}


相关文章
|
1月前
|
存储 算法 C语言
C语言:长方形周长和面积的计算
C语言:长方形周长和面积的计算
|
3月前
leetcode-463:岛屿的周长
leetcode-463:岛屿的周长
16 0
|
3月前
leetcode-6:Z 字形变换
leetcode-6:Z 字形变换
20 0
leetcode 463 岛屿的周长
leetcode 463 岛屿的周长
52 0
leetcode 463 岛屿的周长
2021杭电多校第八场 HDU7063-Square Card(求两圆相交面积)
2021杭电多校第八场 HDU7063-Square Card(求两圆相交面积)
56 0
2021杭电多校第八场 HDU7063-Square Card(求两圆相交面积)
暴力枚举:三角形的组成
题目: 给定一个n个数的数字序列,每个数不超过1e9,有Q此询问,每次询问一个区间是否存在三个数可以组成一 个三角形,输入YES或NO(1<=n,Q<=1e5);
82 0
P4170 [CQOI2007]涂色
P4170 [CQOI2007]涂色
49 0
P4170 [CQOI2007]涂色
|
人工智能 Python
LeetCode面试系列 第10天:No.976 - 三角形的最大周长
LeetCode面试系列 第10天:No.976 - 三角形的最大周长
98 0
LeetCode面试系列 第10天:No.976 - 三角形的最大周长