安徽省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

include

include

include

using namespace std;

struct Point
{
int x;
int y;
};

vector p;
set 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::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  夕音  阅读(758)  评论(0)    收藏  举报