CodeForces - 850A Five Dimensional Points 数学+暴力

42 篇文章 0 订阅
29 篇文章 0 订阅

题意:

找到所有good点,,这个点 满足的条件是对于其他的任意两点,角度不是锐角


思路:

我们可以确定如果某个点是 good 点的话,其他的点肯定是 bad 点,还有判断两点是否是 直角或者钝角的时候 可看题解中方法

因为不管他是几维坐标,选出来的三个点一定是共平面了,形成的角度也是0 - 180 度,,所以 cos 值 也满足正负的相关关系,


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1000 + 7, maxd = (1<<18)-1, mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;

int m;
bool vis[maxn];
set<int> st;

struct node {
    int a, b, c, d, e;
}n[maxn];

bool is_ok(int a, int b, int c) {
    int a1 = n[b].a - n[a].a;
    int b1 = n[b].b - n[a].b;
    int c1 = n[b].c - n[a].c;
    int d1 = n[b].d - n[a].d;
    int e1 = n[b].e - n[a].e;

    int a2 = n[c].a - n[a].a;
    int b2 = n[c].b - n[a].b;
    int c2 = n[c].c - n[a].c;
    int d2 = n[c].d - n[a].d;
    int e2 = n[c].e - n[a].e;

    if(a1*a2 + b1*b2 + c1*c2 + d1*d2 + e1*e2 <= 0) {
        vis[b] = true;
        vis[c] = true;
        return true;
    }
    return false;

}

int main() {

    scanf("%d", &m);
    for(int i = 0; i < m; ++i) {
        scanf("%d %d %d %d %d", &n[i].a, &n[i].b, &n[i].c, &n[i].d, &n[i].e);
    }
    memset(vis, 0, sizeof vis);
    for(int i = 0; i < m; ++i) {
        if(vis[i]) continue;
        int f = 0;
        for(int j = 0; j < m; ++j) {
            if(i == j) continue;
            for(int k = 0; k < m; ++k) {
                if(k == i || k == j) continue;
                if(!is_ok(i, j, k)) { f = 1; }
            }
        }
        if(!f) st.insert(i);
    }
    cout << st.size() << endl;
    for(set<int>::iterator it = st.begin(); it != st.end(); ++it) {
        printf("%d\n", *it+1);
    }

    return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值