首页 > 其他 > 详细

CodeForces 660D

时间:2016-04-20 19:41:25      阅读:267      评论:0      收藏:0      [点我收藏+]

算是一道基础题吧,主要在于如何巧妙地判断平行四边形,看了别人的代码,题解如下

平行四边形判定条件
(x1,y1),(x2,y2),(x3,y3),(x4,y4)
1,3;2,4为两条对角线
x1+x3 == x2+x4 && y1+y3 == y2+y4则为四边形,说白了就是,两条对角线横坐标、纵坐标分别相加(或相减后相等)

证明:

根据平行四边形定义可得

x1+m = x4   y1+n = y4

x2+m = x3   y2+n = y3

所以 x1+x3+m = x2+x4+m 即 x1+x3 = x2+x4

福利:

判断两直线(线段)位置关系
A(a,b) , B(c,d)
 X1 = (int)fabs(a-c);
 Y1 = (int)fabs(b-d);
 X2 = (int)fabs(a-c);
 Y2 = (int)fabs(b-d);
 if(X1*Y2 == X2*Y1)
  printf("这两条线不相交\n");
 else
  printf("这两条线相交\n");

 

用STLmap存储数据,当键值为两个时,要用pair

#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <map>
#define MAXN 2005

using namespace std;

int main()
{
    //freopen("caicai.txt","r",stdin);
    map<pair<int,int>,int>point;
    int x[MAXN],y[MAXN];
    int n;
    scanf("%d",&n);
    int i,j,ans = 0;
    for(i = 0;i<n;i++)
    {
        scanf("%d%d",&x[i],&y[i]);
        for(j = 0;j<i;j++)
            ans += point[make_pair(x[i]+x[j],y[i]+y[j])]++;//ans += point[{x[i]+x[j],y[i]+y[j]}]++; CF是拒绝的。
    }
    cout<<ans<<endl;
    return 0;
}

 

CodeForces 660D

原文:http://www.cnblogs.com/caitian/p/5413689.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!