Gym 101055A 计算几何,暴力

http://codeforces.com/gym/101055/problem/A

题目:给定一些三维空间的点,要你找一个平面,能覆盖尽量多的点,只要求输出点数即可。n<=50

因为数据量小,我们考虑暴力。

首先,三个不在同一条直线的点,确定一个平面,然后枚举其他的点。判断一下,这样的复杂度是n^4。可以接受

特判。所有点都在同一条直线。直接输出n、

后面的,枚举三个点后,能算出这个平面的法向量,然后枚举其他点,与法向量的数量积是0的,就可以ans++

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 50+20;
struct coor
{
    int x,y,z;//坐标,也可以表示成向量,向量也是一个坐标表示嘛
    coor(){}
    coor(int xx,int yy,int zz):x(xx),y(yy),z(zz){}
    bool operator &(coor a) const //判断两个向量是否共线,共线返回true
    {
        //思路:判断叉积,是否各项系数都是0
        return (y*a.z - z*a.y)==0 && (z*a.x - x*a.z)==0 && (x*a.y - y*a.x)==0;
    }
    coor operator ^(coor a) const //得到两个向量的叉积(就是向量积),返回的是一个向量(坐标)
    {
        return coor(y*a.z - z*a.y,z*a.x - x*a.z,x*a.y - y*a.x);
    }
    coor operator -(coor a) const //如果是c-d的话,得到向量dc,
    {
        return coor(x-a.x,y-a.y,z-a.z);
    }
    int operator *(coor a) const //得到两个向量的 数量积,返回整数即可
    {
        return x*a.x+y*a.y+z*a.z;
    }
}a[maxn];
bool all_in_Aline(int n)
{
    //思路,暴力枚举,每三个点,看看是不是所有叉积都是0
    for (int i=1;i<=n;++i) //这个作为起点吧
        for (int j=i+1;j<=n;++j)
            for (int k=j+1;k<=n;++k)
            {
                coor t1 = a[k]-a[i];
                coor t2 = a[j]-a[i];
                if (t1&t2) continue;
                return false;
            }
    return true;
}
bool checkThree (coor a,coor b,coor c)
{
    return (b-a)&(c-a);
}
void work ()
{
    int n;
    cin>>n;
    for (int i=1;i<=n;++i) cin>>a[i].x>>a[i].y>>a[i].z;
    if (all_in_Aline(n)) //如果都在同一直线,直接判断即可
    {
        cout<<n<<endl;
        return ;
    }
    int ans=3;
    for (int i=1;i<=n;++i)
        for (int j=i+1;j<=n;++j)
            for (int k=j+1;k<=n;++k)
            {
                if (checkThree(a[i],a[j],a[k])) continue;
                int t=3;
                coor t1 = (a[k]-a[i])^(a[j]-a[i]); //垂直的向量
                for (int h=1;h<=n;++h)
                {
                    if (h==i||h==j||h==k) continue;
                    if ((a[h]-a[i])*t1 == 0) t++;
                }
                ans = max(ans,t);
            }
    cout<<ans<<endl;
    return ;
}

int main()
{
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    work();
    return 0;
}

时间: 2024-11-04 12:48:00

Gym 101055A 计算几何,暴力的相关文章

BZOJ 1199 HNOI2005 汤姆的游戏 计算几何+暴力

题目大意:给定n个图形,每个图形可以是矩形或圆,m次询问某个点在多少个图形内部 将点按横坐标排序 对于每个图形,二分找到x值满足要求的区间,对于区间内每个点暴力 时间复杂度O(n^2) 数据范围25W 果然像hwd说的一样计算几何题数据范围出的这么大就是作死么= = #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm&

HDU 6697 Closest Pair of Segments (计算几何 暴力)

2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description The closest pair of points problem is a well-known problem of computational geometry. In this problem, you are given \(n\) points in the Euclidean plan

【POJ】2318 TOYS(计算几何+暴力)

http://poj.org/problem?id=2318 第一次完全是$O(n^2)$的暴力为什么被卡了-QAQ(一定是常数太大了...) 后来排序了下点然后单调搞了搞..(然而还是可以随便造出让我的code变成$O(n^2)$的23333) #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include

BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力

1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1199 Description 汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣.于是他开始在一张很大很大的白纸上画很多很多的矩形和圆.画着画着,一不小心将他的爆米花弄撒了,于是白纸上就多了好多好多的爆米花.汤姆发现爆米花在白纸上看起来就像一个个点,有些点落在矩形或圆

Rasheda And The Zeriba Gym - 100283A ? 计算几何

http://codeforces.com/gym/100283/problem/A 考虑到多边形是不稳定的,是可以变来变去的. 那么总是可以把每个点放到圆上. 所以只需要判断圆心角是不是小于等于360即可. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <assert.h>

ACM/ICPC 之 三维计算几何+暴力枚举+判重(HDU5839)

CCPC网赛第八题,求立体几何数量,题解见注释 //立体几何-求满足要求的四面体个数 //要求1:至少4条边相等 //要求2:四条边相等时,另两条边一定不相邻(即对边) //题解:以当前边为不相邻的其中一条边,对可以构成等腰三角形的第三点进行枚举 //再对这些第三点的集合做一次n^2的枚举,分两种情况找出四面体 //如果四条边或五条边相同,则只存在两种重复情况(当前边和对边互换) //如果六条边相同,则存在六种重复情况(每个边作一次当前边) //Time:499Ms Memory:1576K #

HDOJ 5839 计算几何+暴力

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

Gym - 100203A Ariel 暴力+位运算

题意:第i种生物有k[i]个特征,分数是score[i],现在要参加竞赛,报出一种生物a,和一些特征h[i],参加竞赛的所有生物在这些h[i]上面的特征是一样的,a生物有h[i],则所有竞赛的生物都必须有h[i],a生物没有,竞赛的生物也没有,没有提到的则不用管.问你在竞赛中a的排名 思路:特征最多只有10中,所有可以用二进制的每一位表示特征的状态,并记录下每种状态下的生物的类型.现在给你生物的状态,首先要求出能参加竞赛的生物的种类.当 (i&p == t[a]&p) 时,所有拥有i状态的

【POJ】2653 Pick-up sticks(计算几何+暴力)

http://poj.org/problem?id=2653 我很好奇为什么这样$O(n^2)$的暴力能过.... 虽然说这是加了链表优化的,但是最坏不也是$O(n^2)$吗...(只能说数据太弱...) 然后本题裸的判线段相交和点在直线上...(看了网上的标程,不判端点的情况都能过我也是醉了...) #include <cstdio> #include <cstring> #include <cmath> #include <string> #includ