FZU-Problem 2231 平行四边形数
Accept: 66 Submit: 210 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
福州大学第十三届程序设计竞赛
题意:
平行四边形判定:
1、两组对边分别平行的四边形是平行四边形(定义判定法);
2、一组对边平行且相等的四边形是平行四边形;
3、两组对边分别相等的四边形是平行四边形;
4、两组对角分别相等的四边形是平行四边形(两组对边平行判定);
5、对角线互相平分的四边形是平行四边形。
如果1-4th的话,500^4 四个for遍历~绝逼超了
所以排除,根据5th点,前提条件因为三个点不在同一条直线上,所以我们只要判断其中点就好了,
central point ->x(y) = (point->x1(y1) + point->x2 (y2) ) / 2
然后 对 central point 这个集合排序 取k对中点相同的,接下来,要做的就是计算k对有共同中点的点集(每个点集包含两个点)能组成多少个平行四边形,即组合数Ck(下)2(上),展开式为 k*(k-1)/2
#include"iostream"
#include"algorithm"
using namespace std;
struct node{
int x,y;
}p[510],cp[250010];
int cmp(node a,node b){
if(a.x!=b.x){
return a.x<b.x;
}else{
return a.y<b.y;
}
}
int main(){
int j,i,n,co,k,count;
while(cin>>n){
for(i=1; i<=n; i++){
cin>>p[i].x>>p[i].y;
}
co = 0;
for(i=1; i<=n-1; i++){
for(j=i+1; j<=n; j++){
cp[co].x = p[i].x + p[j].x;
cp[co++].y = p[i].y + p[j].y;
}
}
//从0 - co-1
sort(cp,cp+co,cmp);
k = 1;
count = 0;
for(i=1; i<co; i++){
if(cp[i].x==cp[i-1].x && cp[i].y==cp[i-1].y){
k++;//k对中点相同的直线
}
else{ //组合 Ck 2
count += (k*(k-1)/2);
k = 1;
}
}
cout<<count<<endl;
}
return 0;
}
时间: 2024-10-14 20:24:27