Fork me on GitHub

UVALive 6263 The Dragon and the knights --统计,直线分平面

题意:给n条直线,将一个平面分成很多个部分,再给m个骑士的坐标,在一个部分内只要有一个骑士即可保护该部分,问给出的m个骑士是不是保护了所有部分。

解法:计算每个骑士与每条直线的位置关系(上面还是下面),用0,1表示,所以每个骑士会有一个01串,最后统计出这n条直线分成的部分数(可能有平行的),然后排序每个骑士的01串,看有多少个处在不同部分的骑士(01串不同的个数),然后比较个数关系,得出答案。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#define ll long long
using namespace std;
#define N 50007

struct Line
{
    int A,B,C;
}line[107];

bool UPLine(Line ka,ll x,ll y)
{
    ll res = ka.A*x + ka.B*y + ka.C;
    return res > 0;
}

bool intersection(Line ka,Line kb)
{
    if(ka.A*kb.B == ka.B*kb.A)
        return false;
    return true;
}

string ss[N];

int main()
{
    int t,n,m,i,j;
    int x,y;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d%d%d",&line[i].A,&line[i].B,&line[i].C);
        string tmp = "";
        for(i=0;i<n;i++)
            tmp += "0";
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            ss[i] = tmp;
            for(j=0;j<n;j++)
            {
                if(UPLine(line[j],x,y))
                    ss[i][j] = '1';
            }
        }
        int C = n+1;
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
                if(intersection(line[i],line[j]))
                    C++;
        }
        sort(ss,ss+m);
        int cnt = 1;
        for(i=1;i<m;i++)
        {
            if(ss[i] != ss[i-1])
                cnt++;
        }
        if(cnt >= C)
            puts("PROTECTED");
        else
            puts("VULNERABLE");
    }
    return 0;
}
View Code

 

posted @ 2014-07-29 21:08  whatbeg  阅读(266)  评论(0编辑  收藏  举报