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;
}
时间: 2024-09-21 10:27:07

poj 2780 Linearity 【高效版 同一条直线上的点】的相关文章

poj 1118 Lining Up【同一条直线上的点】

这道题总算没有让我感觉超级水,至少我还超时了一次...哈哈哈 题意还比较容易懂:给出 n 个点的整数坐标(n<=700),求一条直线,使得在这条直线上的点数最多,输出点数. 解题思路:采用几何中的三个点是否在一条直线上判定定理:(yi-yk)/(xi-xk)=(yj-yk)/(xj-xk),除法不能出现分母为0的情况,所以转换为乘法做(而且乘法效率也高些),即:(y[i]-y[k])*(x[j]-x[k])==(y[j]-y[k])*(x[i]-x[k])(i.j.k共线). 暴搜肯定尽量追求不

poj 2606 Rabbit hunt【同一条直线上的点】

我想这道2606在一条线上面杀死兔子和上一题1118的在一条线上面投放炸弹貌似没有什么不同...如果硬要扯点不同就是1118没有交代坐标点 的正负,而2606交代了...反正这种解法对于是否包含负数没有影响 直接在上一题的基础上改了一下就顺利AC... 而且我这次好奇的试了一下1118中效率较低的代码,也AC了,可能是因为这里的N是小于200,而且只有一组测试数据的缘故吧 AC的代码之一(高效版): #include <stdio.h> int x[202],y[202]; int main(

Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法

  本文实例讲述了Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法.分享给大家供大家参考.具体如下: 看看下面的例子和效果吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 # -*- coding: utf-8 -*- from matplotlib.widgets import MultiCursor from pylab import figure, show, np t = np.arange(0.0, 2.0, 0.01) s1 = np.si

网易闪电邮高效版的使用方法

闪电邮是一款网易自主研发的优秀电子邮件客户端软件,可同时管理包括网易六大邮箱.QQ.新浪.搜狐.gmail等主流电子邮箱商及企业邮箱等在内的多个邮箱帐户;独创网易专有邮件协议(NMMP邮件协议),同时支持POP3.IMAP邮箱协议;提供免费的全邮件服务,具备操作便捷.高速收发邮件及大附件.实时收信桌面提醒.快速全文检索.网页与客户端邮件同步.邮件过滤归档等功能,还支持自定义皮肤.贺卡等个性化服务,是百万办公族用户首选的邮件管理专家! 邮件客户端软件现在已被写字楼上班人群广泛使用,除了outloo

编程-想在窗口客户区上画很多条直线,该怎么做?

问题描述 想在窗口客户区上画很多条直线,该怎么做? 当我画完一条线后准备要画下一条线时,这条线消失了,有没有什么办法把刚画完的直线留下来,我想在这窗口上画很多条直线,如何修改代码才能实现? 解决方案 那个InvalidateRect()函数,最后一个参数写NULL就好了. 解决方案二: 弄一个数据结构,譬如数组,把每次画线的坐标存储起来,然后在PAINT中需要绘画的是每根直线

VS软件中,窗体,输入起点和终点的X、Y或圆心坐标,如何画出一条直线或圆弧呢?

问题描述 用C#中的窗体功能,输入起点和终点的X.Y或圆心坐标,如何画出一条直线或圆弧呢?新手刚学两天,想请教各位. 解决方案 解决方案二: 不知道你使用什么开发平台.给你搜一个windows此类小练习的开发教程:不论是桌面的wpf还是网页的silverlight,都是一样的开发方法.

李彦宏谈人生:心中的一条直线

在很多人看来我的道路是比较顺的,一步一步好像都事先计划好了一样,可以说是走了直线. 但是我觉得归根到底人一定要做自己喜欢并擅长的事.严格意义上说,十几年前的搜索引擎在中国并不是一个炙手可热的产业,那个时候大家也不会觉得走搜索引擎这条路是一条直线,只不过现在搜索变 成了这么大一个产业,变成了每个人在日常生活中离不开的工具的时候,大家觉得我走的路很顺.其实我在中学的时候,每天下课就跟几个朋友一起去图书馆里看 各地的报纸,那个时候没有互联网,只能是靠报纸来获取信息,我就觉得能够获得这么多信息真的很神奇

fusioncharts pie3D显示数据时正下方会多出一条直线,请问是什么情况?该怎么解决?

问题描述 fusioncharts pie3D显示数据时正下方会多出一条直线,请问是什么情况?该怎么解决?

php绘制一条直线的方法_php技巧

本文实例讲述了php绘制一条直线的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php //1.创建画布 $im = imagecreatetruecolor(300,200);//新建一个真彩色图像,默认背景是黑色,返回图像标识符.另外还有一个函数 imagecreate 已经不推荐使用. //2.绘制所需要的图像 $red = imagecolorallocate($im,255,0,0);//创建一个颜色,以供使用 imageline($im,30,30,240