平行四边形数

C - 平行四边形数

Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u

FZU 2231

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

平行四边形的对角线互相平分,所以可以在输入某个点的坐标后,将该点与前面所有点的中点求出,中点重合的即可构成平行四边形。

这里可以用一个map来存储中点相同的线段数量的信息用pair使中点坐标成为1组数据,对这组数据的map值+1即可。

每当找到一条新的线段与之前的线段的中点重合,则该线段可以与之前所有的相同中点的线段构成平行四边形,所以可以用一个变量ans=map[make_pair(x[i]+x[j],y[i]+y[j])]++;来表示所求结果。

这里之所以不除以2是因为有可能出现小数而不便处理,反正所有中点坐标值都编程倍也没有影响。

#include<cstdio>
#include<map>
#include<cstring>
using namespace std;

int x[505],y[505];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i,j,ans=0;
        memset(x,0,sizeof x);
        memset(y,0,sizeof y);
        map<pair<int,int>,int> a;
        a.clear();
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&x[i],&y[i]);
            for(j=0;j<i;j++)
            {
                ans+=a[make_pair(x[i]+x[j],y[i]+y[j])]++;
            //  printf("%d %d!\n",ans,a[make_pair(x[i]+x[j],y[i]+y[j])]);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-17 07:57:57

平行四边形数的相关文章

FZU-2231 平行四边形数 From 福州大学第十三届程序设计竞赛

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<=

平行四边形数(fzoj_2231) 几何

 Problem 2231 平行四边形数 Accept: 44    Submit: 124 Time Limit: 2000 mSec    Memory Limit : 32768 KB  Problem Description 在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形.  Input 多组数据(<=10),处理到EOF. 每组数据第一行一个整数n(4<=n<=500).接下来n行每行两个整数xi,yi(0

FZU 2231 平行四边形数

FZU - 2231  平行四边形数 题目大意:给你n个点,求能够组成多少个平行四边形? 首先想到的是判断两对边平行且相等,但这样的话得枚举四个顶点,或者把点转换成边然后再枚举所有边相等的麻烦,还不好处理.这时我们就得想到另一个性质,对角线互相平分,这样我们只需枚举对角线,转换一下就是中点.因为给出的点不存在三点共线的,那么我们处理每两个点的中点,如果中点相等,那么说明这两条线互相平分,也就可以组成平行四边形. 1 #include<cstdio> 2 #include<algorith

【POJ】Parallelogram Counting(HASH,数学之平行四边形)

Parallelogram Counting 题意:输入t表示有t组数据 每组数据输入一个数n,表示有n个点 然后有n行,每行是这个点的(x,y) 问这些点能组成多少个平行四边形 思路:求中点,中点一样的是一个平行四边形. 记录同一个中点的个数sum(初始为1),平行四边形数是(sum-1) * sum / 2; #include<iostream> #include<algorithm> using namespace std; typedef long long ll; con

TOJ-1313 Parallelogram Counting

There are n distinct points in the plane, given by their integer coordinates. Find the number of parallelograms whose vertices lie on these points. In other words, find the number of 4-element subsets of these points that can be written as {A, B, C,

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

Problem A Calculus Midterm 题意:略 题解:~~ Problem B 翻翻棋 题意:略 题解:~~ Problem C 平行四边形数 题意:略 题解:~~ Problem D 炉石传说 题意:略 题解:最直接的一个做法就是二分图,跑一遍判断是否匹配的数量为n.还可以的一个做法是贪心:先把对手的血量从大到小排,然后对于自己,选一个能满足对方攻击的自身攻击力最小的一个随从,然后不断重复,最后判断有无可选即可. 1 /*zhen hao*/ 2 #include <cstdi

福州大学第十三届程序设计竞赛_重现总结

 Problem C 平行四边形数 Accept: 82    Submit: 425 Time Limit: 2000 mSec    Memory Limit : 32768 KB  Problem Description 在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形.  Input 多组数据(<=10),处理到EOF. 每组数据第一行一个整数n(4<=n<=500).接下来n行每行两个整数xi,yi(0<

接收行数,打印平行四边形

要求:输入一个1-10的整数,打印出一个如下图的平行四边形 public static void main(String[] args) { System.out.println("请输入需要打印的平行四边形行数:"); Scanner sc=new Scanner(System.in); int hang=sc.nextInt(); if(hang<0||hang>10){ System.out.println("输入的行数无效!"); return;

HDU_5964:平行四边形

打重现赛时,一点思路也没有,然后又看到这题AC数那么少,就直接放弃了.今天重新看了看,借鉴了下别人的,发现此题应该算是一道可解题. 看上去,这题的ans是同时有两个点作为自变量的函数(然而n^2复杂度显然不对,这也应该早点想到).其实,这道题可以先直接假设S中的两个点的坐标分别为B(x1,y1),B'(x2,y2),然后,利用高中学到的解析几何的知识,得到中点坐标的表达式,再结合两条直线的方程,得到A,A'的坐标表达式,有平行四边形四个顶点的坐标,面积也就可以求得了.以上过程全部在纸上完成.最后