sort之结构体排序2
发布日期:2021-06-29 11:10:14 浏览次数:2 分类:技术文章

本文共 1317 字,大约阅读时间需要 4 分钟。

fzu2231 平行四边形数

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

只想说,训练赛的时候,刚开始以为是水题,根据定义去计算,画图搞了好久。后面竟然以为是递归找规律类。后来就这样没了;一直没有做出来。到了后面才知道方法。

求出所有两点的中点然后在去找中点是否相同,之后就要用到排列组合;
在查找中点是否相同,这里就要排序一下,不然就会爆了。

#include
#include
#include
using namespace std; struct di{ int x; int y;}p[510],zp[250010];bool cmp(di a , di b){ if(a.x!=b.x) return a.x < b.x; else return a.y < b.y; }int main(){ int n, l, i, j, num, k; while(scanf("%d",&n) != EOF){ for(i = 0; i < n; i++){ scanf("%d %d",&p[i].x, &p[i].y); } l = 0; for(i = 0; i < n-1; i++){ for(j = i+1; j < n; j++){ zp[l].x = (p[i].x+p[j].x); zp[l].y = (p[i].y+p[j].y);//不能除以2; l++; } } sort(zp, zp+l, cmp); k = 1; num = 0; for(i = 1; i < l; i++){ if(zp[i].x==zp[i-1].x && zp[i].y==zp[i-1].y){ k++; } else{ num += (k*(k-1)/2); k = 1; } } printf("%d\n",num); } return 0 ;}

转载地址:https://blog.csdn.net/zw1996/article/details/51407747 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:母函数模板解释
下一篇:大数相加

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月08日 10时52分13秒