codeforces 851C

来源:互联网 发布:传奇h5修改数据库教程 编辑:程序博客网 时间:2024/06/14 15:04

给你n个五维的点,找到一些这样的点,这个点和任意两个不同的点连线都可以形成直角或者钝角。做题的时候理解错题意了,当成只要有两个点能和他连成直角或钝角就符合条件了。
数量积判断夹角,暴力就好了。
还可以像标程那样,超出某个范围就是0,小范围内暴力。比如二维平面顶多只能由五个点,再多就没有合法的点了。

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 1010;int n;struct Point{    Point(){}    Point(LL _a, LL _b, LL _c, LL _d, LL _e)    :a(_a),b(_b),c(_c),d(_d),e(_e){}    LL a,b,c,d,e;};Point ps[MAXN];vector<int> res;bool check(int i, int j, int k){    Point a(ps[j].a-ps[i].a,ps[j].b-ps[i].b,ps[j].c-ps[i].c,ps[j].d-ps[i].d,ps[j].e-ps[i].e);    Point b(ps[k].a-ps[i].a,ps[k].b-ps[i].b,ps[k].c-ps[i].c,ps[k].d-ps[i].d,ps[k].e-ps[i].e);    int ret = a.a*b.a + a.b*b.b + a.c*b.c + a.d*b.d + a.e*b.e;    return ret <= 0;}int main(){    scanf("%d",&n);    for(int i = 0; i < n; ++i)        scanf("%d %d %d %d %d",&ps[i].a,&ps[i].b,&ps[i].c,&ps[i].d,&ps[i].e);    for(int i = 0; i < n; ++i)    {        bool f = false;        for(int j = 0; j < n; ++j)        {            if(i == j) continue;            for(int k = 0; k < n; ++k)            {                if(k == j || k == i) continue;                if(check(i,j,k) == false)                {                    f = true;                    break;                }            }            if(f) break;        }        if(!f) res.push_back(i+1);    }    cout << res.size() << endl;    for(int x:res)        cout << x << " ";    cout << endl;    return 0;}
原创粉丝点击