平行四边形数
Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形。
Input
多组数据(<=10),处理到EOF。
每组数据第一行一个整数n(4<=n<=500)。接下来n行每行两个整数xi,yi(0<=xi,yi<=1e9),表示每个点的坐标。
Output
每组数据输出一个整数,表示用这些点能构成多少个平行四边形。
Sample Input
40 11 01 12 0
Sample Output
1
题目解法:求出任意两个点的中点,因为题目中已经表明任意三个点不在一条直线上,所以中点相同的点中任选两个都能组成平行四边形。
脑补一下数学知识,数学毕竟是万物之根;利用了平行四边形定理,中点到对角线俩点的距离相等,巧妙的解决了枚举的复杂,避免了讨
论平行斜率的问题,对于数学知识薄弱的人是根本不会想到用这个方法的,只有多了解才能突破思维的局限;
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 1000000
struct Node
{
int x, y;
}p[N];
struct node
{
int x, y;
}a[N];
int cmp(const void *m,const void *n);
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>p[i].x>>p[i].y;
}
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
a[cnt].x=(p[i].x+p[j].x);//虽然是中点但要避免INT的数值取整问题,可以不除于二代替
a[cnt].y=(p[i].y+p[j].y);
cnt++;
}
}
qsort(a,cnt,sizeof(a[0]),cmp);
int num=1, sum=0;
for(int i=1;i<cnt;i++)
{
if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y)
{
num++;
}
else
{
sum+=(num*(num-1))/2;
num=1;
}
}
if(num!=1)
{
sum+=(num*(num-1))/2;//组合数学
}
cout<<sum<<endl;
}
return 0;
}
int cmp(const void *m,const void *n)
{
struct node *o=(struct node *)m;
struct node *q=(struct node *)n;
if(o->x>q->x)
{
return 1;
}
else if(o->x==q->x&&o->y>q->y)
{
return 1;
}
else
{
return -1;
}
}
题目解法:求出任意两个点的中点,因为题目中已经表明任意三个点不在一条直线上,所以中点相同的点中任选两个都能组成平行四边形。
脑补一下数学知识,数学毕竟是万物之根;利用了平行四边形定理,中点到对角线俩点的距离相等,巧妙的解决了枚举的复杂,避免了讨
论平行斜率的问题,对于数学知识薄弱的人是根本不会想到用这个方法的,只有多了解才能突破思维的局限;
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 1000000
struct Node
{
int x, y;
}p[N];
struct node
{
int x, y;
}a[N];
int cmp(const void *m,const void *n);
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>p[i].x>>p[i].y;
}
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
a[cnt].x=(p[i].x+p[j].x);//虽然是中点但要避免INT的数值取整问题,可以不除于二代替
a[cnt].y=(p[i].y+p[j].y);
cnt++;
}
}
qsort(a,cnt,sizeof(a[0]),cmp);
int num=1, sum=0;
for(int i=1;i<cnt;i++)
{
if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y)
{
num++;
}
else
{
sum+=(num*(num-1))/2;
num=1;
}
}
if(num!=1)
{
sum+=(num*(num-1))/2;//组合数学
}
cout<<sum<<endl;
}
return 0;
}
int cmp(const void *m,const void *n)
{
struct node *o=(struct node *)m;
struct node *q=(struct node *)n;
if(o->x>q->x)
{
return 1;
}
else if(o->x==q->x&&o->y>q->y)
{
return 1;
}
else
{
return -1;
}
}