hdu 5839

找立体四边形,至少4边相等;如果4边相等,不相等的两边必须相对。

比赛中一直没想通怎么统计正四面体,看题结,竟然是暴力。。。想想就能出数据hack了,不过,谁让数据水呢。。。

#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <stack>
#include <cstdlib>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>

using namespace std;
int cas=1;
struct Point3
{
    int x,y,z;
}a[210];
int onepanel(Point3 a1,Point3 a2,Point3 a3,Point3 a4)
{
    int A = ((a2.y-a1.y)*(a3.z-a1.z)-(a2.z-a1.z)*(a3.y-a1.y));
    int B = ((a2.z-a1.z)*(a3.x-a1.x)-(a2.x-a1.x)*(a3.z-a1.z));
    int C = ((a2.x-a1.x)*(a3.y-a1.y)-(a2.y-a1.y)*(a3.x-a1.x));
    int D = -(A * a1.x + B * a1.y + C * a1.z);
    int ret = A*a4.x+B*a4.y+a4.z*C+D;
    if (ret==0) return 1;
    else return 0;
}
int dis(Point3 a,Point3 b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
}
map<int,int>mp;
map<int,int>::iterator it;
int main()
{
    int T;
    scanf ("%d",&T);
    while (T--)
    {
        int n;
        scanf ("%d",&n);
        for (int i=0;i<n;i++)
        {
            scanf ("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
        }
        int ans=0,zheng=0;
        for (int i=0;i<n;i++)
        {
            for (int j=i+1;j<n;j++)
            {
                mp.clear();
                int thi=dis(a[i],a[j]);
                for (int k=0;k<n;k++)
                {
                    if (k!=i&&k!=j)
                    {
                        int ta=dis(a[i],a[k]),tb=dis(a[j],a[k]);
                        if (ta==tb)
                        {
                            if (mp.find(ta)==mp.end())
                                mp[ta]=0;
                            mp[ta]++;
                        }
                    }
                }
                for (it=mp.begin();it!=mp.end();++it)
                {
                    if (it->second>=2)
                    {
                        ans+=(it->second)*(it->second-1)/2;
                    }
                }
            }
        }
        printf ("%d\n",ans);
        ans/=2;
        int ccc=0;
        for (int i=0;i<n;i++)
        {
            for (int j=i+1;j<n;j++)
            {
                for (int k=0;k<n;k++)
                {
                    if (k!=i&&k!=j&&dis(a[i],a[j])==dis(a[i],a[k])&&dis(a[i],a[j])==dis(a[k],a[j]))
                    {
                        for (int l=0;l<n;l++)
                        {
                            if (k!=l&&dis(a[i],a[j])==dis(a[i],a[l])&&dis(a[i],a[j])==dis(a[j],a[l])&&dis(a[i],a[j])==dis(a[k],a[l]))
                                ccc++;
                        }
                    }
                }
            }
        }
        printf ("%d\n",ccc);
        printf ("Case #%d: %d\n",cas++,ans-ccc/6);
    }
    return 0;
}
时间: 2024-08-24 01:33:24

hdu 5839的相关文章

HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不相邻. 暴力4重循环,但是在第3重循环的时候需要判断是否是等腰三角形,这便是一个剪枝.在第4重循环的时候判断4点是否共面 (叉乘), 5或者6边相等就+1,4边相等就判断另外两边是否相交就行了. 赛后过的,觉得自己还是太菜了. 1 //#pragma comment(linker, "/STACK:

【HDU 5839】Special Tetrahedron(计算几何)

空间的200个点,求出至少四边相等,且其余两边必须不相邻的四面体的个数. 用map记录距离点i为d的点有几个,这样来优化暴力的四重循环. 别人的做法是枚举两点的中垂面上的点,再把到中点距离相等的点找出来,n^3的样子. 还要注意四个点共面的情况. 共面判断就是用叉乘计算出ijk三点所在面的法向量,然后判断il向量是否和法向量垂直,是则共面. #include <cstdio> #include <cstring> #include <algorithm> #includ

hdu 5839 Special Tetrahedron 计算几何 求特殊四面体个数

Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 175    Accepted Submission(s): 64 Problem Description Given n points which are in three-dimensional space(without repetition).

HDU 5839 Special Tetrahedron

暴力水过,数据水. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue>

HDU 5839 Special Tetrahedron(计算几何)

传送门 Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 616    Accepted Submission(s): 258 Problem Description Given n points which are in three-dimensional space(without repetit

HDOJ 5839 计算几何+暴力

链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 题意: 给你立体空间内的n个点,问能组成多少个四面体满足 1.至少四条棱相等 2.如果刚好四条棱相等,那么不相等的两条棱不能相邻 题解: 直接暴力,先枚举3个点,如果这三个点组成的三角形三边都不相等,那么就不用枚举第四个点了,其实很多情况都不用枚举第四个点 如果这个三角形是等边或等腰三角形,再分别枚举第四个点,分情况计算 开始的时候忘了判断还要判断四点共面,所以没用Point结构体,结果连样例都

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往