2016 CCPC网络选拔赛 部分题解

Posted izcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016 CCPC网络选拔赛 部分题解相关的知识,希望对你有一定的参考价值。

 

 

HDU 5389 - Special Tetrahedron

题意:给定空间中 n个点(n<=100),求满足两个条件的特殊四面体的个数。条件1:至少4条边长度相同;条件2:如果只有4条边长度相同,则剩下两条边不能相邻。

思路:C(100, 4)不大,时限4s,暴力枚举即可。四个点不能共面,先求点积再叉积判断是否为0,即四面体体积不能为0。

TM我再次敲错了向量叉积函数cross。。。逐行debug才发现

技术图片
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct P 
    int x, y, z;
    P(int xx=0, int yy=0, int zz=0):x(xx), y(yy), z(zz) 
    P operator-(const P& a) 
        return P(x-a.x, y-a.y, z-a.z);
    
    P operator*(const P& b) 
        return P(y*b.z-z*b.y, z*b.x-x*b.z, x*b.y-y*b.x);
    
    int dis() 
        return x*x + y*y + z*z;
    
    void print() 
        printf("(%d %d %d)\n", x, y, z);
    
p[210];
int cross(const P& a, const P& b) 
    return a.x*b.x + a.y*b.y + a.z*b.z;


int main()

    int cas=0, t; cin>>t;
    while(cas<t) 
        int n;
        scanf("%d", &n);
        for(int i=0;i<n;i++) 
            scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].z);
        

        int ans = 0;
        for(int i=0;i<n;i++) 
            for(int j=i+1;j<n;j++) 
                for(int k=j+1;k<n;k++) 
                    int dis1 = (p[i]-p[j]).dis();
                    int dis2 = (p[i]-p[k]).dis();
                    int dis3 = (p[j]-p[k]).dis();
                    if(dis1!=dis2 && dis2!=dis3 && dis1!=dis3) continue;

                    int equa = -1; P t1, t2;
                    if(dis1==dis2 && dis1!=dis3) equa = dis1, t1 = p[j], t2 = p[k];
                    if(dis1==dis3 && dis1!=dis2) equa = dis1, t1 = p[i], t2 = p[k];
                    if(dis2==dis3 && dis1!=dis2) equa = dis2, t1 = p[i], t2 = p[j];

                    // if(equa==-1) equa = dis1;
                    for(int l=k+1;l<n;l++) 
                        if(cross((p[i]-p[j])*(p[i]-p[k]), p[i]-p[l])==0) continue;

                        if(equa!=-1)  
                            if((p[l]-t1).dis()==equa && (p[l]-t2).dis()==equa) 
                                ++ans;
                            //    printf("%d %d %d %d\n", i, j, k, l);
                            
                         else  // 底面三边相等 
                            int dis4 = (p[l]-p[i]).dis();
                            int dis5 = (p[l]-p[j]).dis();
                            int dis6 = (p[l]-p[k]).dis();
                            if(dis4==dis1 && dis5==dis1 || dis4==dis1 && dis6==dis1 || dis5==dis1 && dis6==dis1) 
                                ++ans;
                            //    printf("%d %d %d %d\n", i, j, k, l);
                            
                        
                        
                    
                
            
        
        
        printf("Case #%d: %d\n", ++cas, ans);
    
    return 0;
View Code

 

以上是关于2016 CCPC网络选拔赛 部分题解的主要内容,如果未能解决你的问题,请参考以下文章

2021CCPC网络选拔赛题解

2021CCPC网络赛部分题解

[2018 CCPC 网络赛] 部分题解 (待补充)

2016中国大学生程序设计竞赛(ccpc 杭州)题解报告

2016中国大学生程序设计竞赛(ccpc 杭州)题解报告

2016中国大学生程序设计竞赛(ccpc 长春)题解报告