uva270 - Lining Up(暴力)

题目:uva270 - Lining Up

解题思路:对于每个点都计算一下,它与其他点的斜率,这样就可以判断与这个点在同一条直线的点。每个点都这样做,维护最大值就可以了。

注意斜率不存在的情况。

找相同斜率的时候用了multiset。

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <set>
using namespace std;

const int N = 705;
const double esp = 1e-9;

int n;
char str[N];
double ki[N];
int visit[N];

multiset <double> K;

struct NODE {

	double x, y;
}node[N];

double Max (const double a, const double b) { return a > b ? a: b; }
double Fabs (const double a, const double b) { 

	if (a > b)
		return a - b;
	return b - a;
}

int main () {

	int t;
	int cnt;
	int count;
	scanf ("%d%*c%*c", &t);
	while (t--) {

		n = 0;
		while (gets(str) != NULL && str[0] != '\0') {

			sscanf (str, "%lf%lf", &node[n].x, &node[n].y);
			n++;
		}

		cnt = 0;
		for (int i = 0; i < n; i++) {
			K.clear();
			count = 0;
			memset (visit, 0, sizeof (visit));
			for (int j = 0; j < n; j++) {

				if (i == j)
					continue;
				if (Fabs (node[i].x, node[j].x) <= esp) {

					count++;
					continue;
				}
				else
		            ki[j] = (node[i].y - node[j].y) / (node[i].x - node[j].x);
				K.insert (ki[j]);
				visit[j] = 1;

			}

			for (int j = 0; j < n; j++) {

				 if (visit[j]) {

					 cnt = Max (cnt, K.count(ki[j]));
//					 printf ("%d\n", K.count(ki[j]));
				 }
			}
			cnt = Max (cnt, count);
		}

		printf ("%d\n", cnt + 1);
		if (t)
		printf ("\n");

	}
	return 0;
}

uva270 - Lining Up(暴力)

时间: 2024-10-18 12:19:06

uva270 - Lining Up(暴力)的相关文章

UVALive5379 UVA270 Lining Up

Regionals 1994 >> North America - East Central NA 问题链接:UVALive5379 UVA270 Lining Up. 题意简述:输入n,输入n个整数对,即n个坐标点,问最多共线点数是多少. 问题分析:用暴力法解决这个问题,好在计算规模不算大. 程序中,判断共线时,使用的是乘法,没有用除法,可以保证精确的计算结果. 特别需要说明的是,这个问题虽然与POJ1118 HDU1432 Lining Up是相同的问题,但是数据输入格式不一样,需要特别处

Lining Up(在一条直线上的最大点数目,暴力)

Lining Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1274    Accepted Submission(s): 366 Problem Description ``How am I ever going to solve this problem?" said the pilot.  Indeed, the pilo

uva 270 Lining Up(暴力)

这道题目我是暴力做出来的,复杂度是n^3,因为数组做多有700组,大约可以用这个复杂度,虽然严格来说500多才 是正常的,每次都是选择两个坐标然后确定一条直线,然后遍历一下其他点,用叉积形式判一下是否在一条直线上就ok 啦,网上说可以用极角排序来解,复杂度是n^2logn然而我看了看并没有想学的欲望...以后再学吧,,,还用到了 sscanf函数,看别人这样用的,就是在一个数组里匹配想要的类型...这题比较坑的就是输入了.每两个输出之间 有空行,最后一组后面不能加空行...而且坐标输入之前有空行

POJ1118 HDU1432 Lining Up

问题链接:POJ1118 HDU1432 Lining Up. 题意简述:输入n,输入n个整数对,即n个坐标点,问最多共线点数是多少. 问题分析:用暴力法解决这个问题,好在计算规模不算大. 程序中,判断共线时,使用的是乘法,没有用除法,可以保证精确的计算结果. AC的C语言程序如下: /* POJ1118 HDU1432 Lining Up */ #include <stdio.h> #define MAXN 700 struct { int x, y; } p[MAXN]; /* point

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

玲珑杯 round18 A 计算几何瞎暴力

题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. 首先注意数很大可能爆int,用LL得话注意强制转换或者全设为LL,假如  int a=50000,b=a;  LL sum=a*b; 则会爆出,除非ab都是LL 或者 sum=(LL)a*(LL)b; 还有就是R最大就是30,我们不妨设ans[i]表示R<=i的组合个数,做一个前缀和方便快速询问.

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

A. The Fault in Our Cubes 暴力dfs

http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行,就会早早退出. 这样写起来比较好写. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <

HDU 5690 All X 暴力循环节

分析:暴力找循环节就好了 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include <stack> #include <vector> #include <map> #include <queue> #inc