LightOJ 1058 平行四边形的判断定理

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

题目思路:这道题卡时间,而且卡内存。你要尽可能的想办法优化。

平行四边形的判定定理:

  1. 两组对边分别平行的四边形是平行四边形(定义判定法);
  2. 一组对边平行且相等的四边形是平行四边形;
  3. 两组对边分别相等的四边形是平行四边形;
  4. 两组对角分别相等的四边形是平行四边形(两组对边平行判定);
  5. 对角线互相平分的四边形是平行四边形。

这道题用定理5判断。

记录每条边的中点坐标,如果两个边的中点坐标相同,证明这两条边为一个平行四边形的两条对角线。

#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f
#define MAX 1000005

using namespace std;

struct node
{
    double midx,midy;
    int x,y;
}Map[MAX];

int cmp(node A,node B)
{
    if(A.midx != B.midx)
        return A.midx > B.midx;
    return A.midy > B.midy;
}
int main()
{
    int T,n,i,j,num=1,k;
    long long sum,cnt,q;
    scanf("%d",&T);
    while(T--)
    {
        sum=0;
        cnt=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&Map[i].x,&Map[i].y);
        }

        for(i=1;i<=n;i++)
        {
            for(j=i+1;j<=n;j++)
            {
                Map[cnt].midx=(Map[i].x+Map[j].x)/2.0;
                Map[cnt++].midy=(Map[i].y+Map[j].y)/2.0;
            }
        }

        sort(Map,Map+cnt,cmp);//为了后面的操作更省时,先排序

        i=0;
        k=0;
        q=1;
        while(i < cnt)
        {
            if(Map[i].midx==Map[k].midx && Map[i].midy==Map[k].midy && k!=i)
                {
                    sum+=q;//新增加的边可以与之前的每一条拥有相同中点的边形成一个新的平行四边形
                    q++;
                }
            else if(Map[i].midx!=Map[k].midx || Map[i].midy!=Map[k].midy)
            {
                k=i;
                q=1;
            }
            i++;
        }
        printf("Case %d: %lld\n",num++,sum);
    }
    return 0;
}

时间: 2024-10-26 20:10:20

LightOJ 1058 平行四边形的判断定理的相关文章

LightOJ - 1058 - Parallelogram Counting(数学,计算几何)

链接: https://vjudge.net/problem/LightOJ-1058 题意: 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 o

POJ1300 Door Man 欧拉回路的判断

题目链接: 1300 题意: 一个房子中有(编号0~N-1)N个房间和X个连通两个房间的门,所有房间都是连通的,每次经过一扇门时这扇门会被关闭.问:一个人从M号房间出发能否成功到达0号房间并关闭所有门. 题解: 此题是欧拉回路的入门题,首先学习无向图欧拉回路的判断定理: 无向图G 存在欧拉通路的充要条件是:G 为连通图,并且G 仅有两个奇度结点(度数为奇数的顶点)或者无奇度结点. 该题是固定起点和终点的的无向图. 所以能构成欧拉回路只有两种情况: 1 所有点的度数为偶数 2 起点终点度数为奇数

kuangbin 带你飞 数学基础

模版整理: 晒素数 void init() { cas = 0; for (int i = 0 ; i < MAXD ; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2 ; i < MAXD ; i++) { if (is_prime[i]) { prime[cas++] = i; for (int j = i + i ; j < MAXD ; j += i) is_prime[j] =

POJ 1971 Parallelogram Counting

题目链接: http://poj.org/problem?id=1971 题意: 二维空间给n个任意三点不共线的坐标,问这些点能够组成多少个不同的平行四边形. 题解: 使用的平行四边形的判断条件:对角线互相平分的四边形是平行四边形. 所以我们枚举每一条线段,如果有两条线段的中点是重合的,那么这四个顶点就能构成一个平行四边形,我们也就是说每条线段我们只要维护中点就可以了. 1.map维护中点:(数据比较大,t了) 1 #include<iostream> 2 #include<cstdio

因素空间发展评述

因素空间发展评述      刘海涛1,包研科1,郭嗣琮1,何华灿2, 何平3 (1. 辽宁工程技术大学 智能工程与数学研究院, 辽宁 阜新 123000: 2. 西北工业大学 计算机学院,陕西 西安 710072: 3. 辽宁警官学院 信息系,辽宁 大连 116036) ——2016年3月 摘 要:为了适应信息革命和大数据时代的需要,模糊数学要更多地切入智能数据的领域. 在这方面,我国早期学者汪培庄教授提出了因素空间的数学理论,从服务于模糊数学的研究开始,进而转向认知描述,建立了知识表示的数学描

欧拉回路(Euler Circuit)

定义:若一副图中从某个顶点A走出,经过图中的所有的边,且每条边只经过一次,则称这个环为欧拉回路,如果某幅图含有这样的环,则这幅图叫做欧拉图. 如何判断一幅图是不是欧拉图,也即一幅图中是否含有欧拉回路. 如果一幅图中所有顶点的出度等于入度,且此图为强连通图,则此图含有欧拉回路,这幅图为欧拉图. 如何在程序中实现判断一副图是否含有欧拉回路呢?如果存在,则将路径打印出来. 判断是否为存在欧拉回路可以直接利用上面的判断定理,但是打印出相应的路径就相对困难一些. 假设图G为一副含有欧拉回路的图,也即欧拉图

了解神经网络

一, 前言 如今,人工智能的火热发展.神经网络作为人工智能的底层模型,也就是说,想要学习人工智能,就必须从神经网络开始. 二,神经网络 1, 神经网络可以分为两种,一种是生物神经网络,一种是人工神经网络. 2, 我们学习的人工神经网络是一种模仿动物神经网络行为特征,直白的说就是类脑特征. 3, 人工神经网络简介:是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型.在工程与学术界也常直接简称为"神经网络"或类神经网络. 三,什么是神经网络 最近非常火热的深度学习,想必都因该听说

数学常用化简技巧与常用公式【运算能力辅导】

A.代数部分 1. 繁分式化简分式 : \(\cfrac{\frac{1}{a}+\frac{2}{b}+\frac{1}{c}}{\frac{3}{ac}-\frac{1}{b}+\frac{4}{bc}}=\cfrac{(\frac{1}{a}+\frac{2}{b}+\frac{1}{c})\times abc}{(\frac{3}{ac}-\frac{1}{b}+\frac{4}{bc})\times abc}=\cfrac{bc+2ac+ab}{3b-ac+4a}\):同乘 2.分式中

Havel--Hakimi定理判断可图化 python

list1 = [ 4, 7, 7, 3, 3, 3, 2, 1 ] list2 = [ 5, 4, 3, 3, 2, 2, 2, 1, 1, 1 ] def havel_hakimi_algo( degree_list ): degree_list.sort( reverse = True ) print degree_list for degree in degree_list: if degree < 0: return False if degree != 0: remove_val =