FZU 2231 平行四边形数

FZU - 2231  平行四边形数

  题目大意:给你n个点,求能够组成多少个平行四边形?

  首先想到的是判断两对边平行且相等,但这样的话得枚举四个顶点,或者把点转换成边然后再枚举所有边相等的麻烦,还不好处理。这时我们就得想到另一个性质,对角线互相平分,这样我们只需枚举对角线,转换一下就是中点。因为给出的点不存在三点共线的,那么我们处理每两个点的中点,如果中点相等,那么说明这两条线互相平分,也就可以组成平行四边形。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N=520;
 5 struct Node{
 6     double x,y;
 7 }p[N],zp[N*N];
 8 bool cmp(const Node &n1,const Node &n2){
 9     return n1.x==n2.x ? n1.y<n2.y : n1.x<n2.x;
10 }
11 int main()
12 {
13     int n,m;
14     while(~scanf("%d",&n))
15     {
16         for(int i=0;i<n;i++)
17             scanf("%lf%lf",&p[i].x,&p[i].y);
18         m=0;
19         for(int i=0;i<n;i++)
20             for(int j=i+1;j<n;j++)
21             {
22                 zp[m].x=(p[i].x+p[j].x)/2;
23                 zp[m++].y=(p[i].y+p[j].y)/2;
24             }
25         sort(zp,zp+m,cmp);
26         int ans=0;
27         zp[m].x=-1,zp[m].y=-1;
28         for(int i=0,j=0;i<=m;i++)
29         {
30             if(i&&(zp[i].x!=zp[i-1].x||zp[i].y!=zp[j].y))
31             {
32                 ans+=(i-j)*(i-j-1)/2;
33                 j=i;
34             }//中点相等的边两两可以组成一个平行四边形
35         }
36         printf("%d\n",ans);
37     }
38     return 0;
39 } 

爱的四边形平平行

原文地址:https://www.cnblogs.com/LMCC1108/p/10520346.html

时间: 2024-08-02 03:02:26

FZU 2231 平行四边形数的相关文章

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

平行四边形数

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<

[ACM] FZU 2087 统计数边 (有多少边至少存在一个最小生成树里面)

Problem Description 在图论中,树:任意两个顶点间有且只有一条路径的图. 生成树:包含了图中所有顶点的一种树. 最小生成树:对于连通的带权图(连通网)G,其生成树也是带权的.生成树T各边的权值总和称为该树的权,权最小的生成树称为G的最小生成树(Minimum Spanning Tree).最小生成树可简记为MST. 但是,对于一个图而言,最小生成树并不是唯一的. 现在,给你一个连通的有权无向图,图中不包含有自环和重边,你的任务就是寻找出有多少条边,它至少在一个最小生成树里.图保

【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;