安徽省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年“京胜杯”大学生程序设计竞赛
二、算法描述
- 题目要求,输入一组点,计算任意两点的斜率,存入一个集合中,因此输入一个点,将其与之前已输入的点做斜率计算,计算出斜率存储在tempD中;
- 由于是不重复的集合,因此采用STL中的set作为集合的存储,set自动检测重复,重复的元素不会添加到集合中,因此直接将tempD插入到斜率的集合中,由set自动检测判断;
- 输出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;
}

浙公网安备 33010602011771号