-
- 给你一个点集求能分割成几种不同的2个空间
- 可以转化为求点集能有几条直线
- 利用3点共线的思想 通过gcd来确定 一条直线最小两个点
- 用的学长的思路和代码。。。
#include <cstdio> #include <map> #define maxn 1005 using namespace std; inline int gcd(int a,int b){return b==0?a:gcd(b,a%b);} struct Point{ int x,y; Point(){} inline Point(int _x,int _y){ x=_x; y=_y; } inline double lenx(const Point &b)const{ return x-b.x; } inline double leny(const Point &b)const{ return y-b.y; } }P[maxn]; int main(){ int n; while(~scanf("%d",&n)){ for(int i=1;i<=n;++i){ int x,y; scanf("%d%d",&x,&y); P[i]=Point(x,y); } int ans=0; for(int i=1;i<=n;++i){ map<pair<int ,int>,int> dp; for(int j=i+1;j<=n;++j){ int x=P[i].lenx(P[j]); int y=P[i].leny(P[j]); int z=gcd(x,y); if(!dp[make_pair(x/z,y/z)])dp[make_pair(x/z,y/z)]=++ans; } } printf("%d\n",ans<<1); } return 0; }
2014年山东省第五届ACM大学生程序设计竞赛Painting Cottages
猜你喜欢
转载自blog.csdn.net/clx55555/article/details/80032762
今日推荐
周排行