您的位置:首页 > 其它

FZU 2231 平行四边形数 (几何 想法)

2016-06-02 14:20 363 查看
Problem 2231 平行四边形数

Accept: 104    Submit: 340

Time Limit: 2000 mSec    Memory Limit : 32768 KB



 Problem Description

在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形。



 Input

多组数据(<=10),处理到EOF。

每组数据第一行一个整数n(4<=n<=500)。接下来n行每行两个整数xi,yi(0<=xi,yi<=1e9),表示每个点的坐标。



 Output

每组数据输出一个整数,表示用这些点能构成多少个平行四边形。



 Sample Input

4
0 1
1 0
1 1
2 0



 Sample Output

1



 Source

福州大学第十三届程序设计竞赛

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2231

题目分析:由于不会有三点共线,因此我们直接记录任意两点的中点,根据平行四边形对角线互相平分,那么对于一个为n个点对中点的点其能构成的平行四边形个数为C(n,2),因此把所有点能够成的个数累加即可

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 505;

struct LINE
{
int x, y;
}l[MAX], mid[MAX * MAX];

bool cmp(LINE a, LINE b)
{
if(a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}

int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
for(int i = 0; i < n; i++)
scanf("%d %d", &l[i].x, &l[i].y);
int cnt = 0;
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
mid[cnt].x = l[i].x + l[j].x;
mid[cnt ++].y = l[i].y + l[j].y;
}
}
sort(mid, mid + cnt, cmp);
int p = 1, ans = 0;
for(int i = 1; i < cnt; i++)
{
if(mid[i].x == mid[i - 1].x && mid[i].y == mid[i - 1].y)
p ++;
else
{
ans += p * (p - 1) / 2;
p = 1;
}
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: