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


相关文章
|
5月前
|
Java
三阶魔方公式详解及快速解法方法介绍
三阶魔方公式详解及快速解法方法介绍
|
算法
算法提高:计算几何基础 | 详解凸包问题
点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内
178 0
算法提高:计算几何基础 | 详解凸包问题
Leecode 836. 矩形重叠最简单易懂的一个思想
Leecode 836. 矩形重叠最简单易懂的一个思想
44 0
LeetCode每日一题(10)——三维形体投影面积(保姆级)
三维形体投影面积 1.题目 2.示例 3.思路 理解题目 解题思路 4.代码
125 0
LeetCode每日一题(10)——三维形体投影面积(保姆级)
|
算法 测试技术
分治法解二维的最近对问题,算法分析与代码实现,蛮力法与分治法解决二维的最近对问题的区别
分治法解二维的最近对问题,算法分析与代码实现,蛮力法与分治法解决二维的最近对问题的区别
360 0
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
108 0
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
|
Python
LeetCode每日一题——883. 三维形体投影面积
在 n x n 的网格 grid 中,我们放置了一些与 x,y,z 三轴对齐的 1 x 1 x 1 立方体。
123 0
LeetCode每日一题——883. 三维形体投影面积
|
算法 定位技术 Perl
|
存储 算法
算法题每日一练---第41天:三角形最小路径和
给定一个三角形 triangle ,找出自顶向下的最小路径和。
97 0
算法题每日一练---第41天:三角形最小路径和
|
算法 Java C#
【算法千题案例】⚡️每日LeetCode打卡⚡️——58.岛屿的周长
📢前言 🌲原题样例:岛屿的周长 🌻C#方法:排序 🌻Java 方法一:迭代 🌻Java 方法二:深度优先搜索 💬总结
【算法千题案例】⚡️每日LeetCode打卡⚡️——58.岛屿的周长