安徽省2015年“京胜杯”大学生程序设计竞赛LU的困惑

LU的困惑

Time Limit: 1000 MS

Memory Limit: 65536 KB

一、题目

Description

Master LU 非常喜欢数学,现在有个问题:在二维空间上一共有n个点,LU每连接两个点,就会确定一条直线,对应有一个斜率。现在LU把平面内所有点中任意两点连线,得到的斜率放入一个集合中(若斜率不存在则不计入集合),他想知道这个集合中有多少个元素。

Input

第一行是一个整数T,代表T组测试数据

每组数据第一行是一个整数n,代表点的数量。2<n<1000

接下来n行,每行两个整数,0<=x<10000,0<=y<10000,代表点的坐标

Output

输出斜率集合中有多少个元素

Sample Input

2
4
1 1
2 2
3 3
3 6
4
1 1
2 2
2 0
3 1

Sample Output

3
3

Source

安徽省2015年“京胜杯”大学生程序设计竞赛

二、算法描述

  1. 题目要求,输入一组点,计算任意两点的斜率,存入一个集合中,因此输入一个点,将其与之前已输入的点做斜率计算,计算出斜率存储在tempD中;
  2. 由于是不重复的集合,因此采用STL中的set作为集合的存储,set自动检测重复,重复的元素不会添加到集合中,因此直接将tempD插入到斜率的集合中,由set自动检测判断;
  3. 输出set中的元素数目;

三、注意事项

由于斜率并不一定是整数,因此计算斜率时,将整数的点坐标转换为double再进行计算,set中存储的也是double值;

四、源代码

AC源代码如下:

#include<iostream>
#include<set>
#include<vector>
#include<algorithm>

using namespace std;

struct Point
{
   int x;
   int y;
};

vector<Point>  p;
set<double> slope;
int T,n; 

int main(void)
{
   cin >> T;
   int x,y,i,j;
   Point temp;
   double tempD;
   for(i=0;i<T;i++)
   {
	  cin >> n;
	  for(j=0;j<n;j++)
	  {
		 cin>>x>>y;
		 for(vector<Point>::iterator u=p.begin(); u!=p.end(); u++)
		 {
			    if(u->x==x) continue;
			    tempD=((double)y-(double)u->y) / ((double)x-(double)u->x);
			    slope.insert(tempD);
		 }
		 temp.x=x;
		 temp.y=y;
		 p.push_back(temp);
	  }
	  cout << slope.size() << endl;
	  p.clear();
	  slope.clear();
   }
   return 0;
}
posted @ 2016-04-30 09:30  夕音  阅读(753)  评论(0)    收藏  举报