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;
}

UVALive 6263 The Dragon and the knights --统计,直线分平面,布布扣,bubuko.com

时间: 2024-08-12 06:21:18

UVALive 6263 The Dragon and the knights --统计,直线分平面的相关文章

5-24 树种统计 (25分)

5-24 树种统计   (25分) 随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. 输入格式: 输入首先给出正整数N(\le 10^5≤10?5??),随后N行,每行给出卫星观测到的一棵树的种类名称.种类名称由不超过30个英文字母和空格组成(大小写不区分). 输出格式: 按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位. 输入样例: 29 Red Alder Ash Aspe

PTA乙级 (1042 字符统计 (20分))

1042 字符统计 (20分) https://pintia.cn/problem-sets/994805260223102976/problems/994805280817135616 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <string> using namesp

L1-003 个位数统计 (15分)

L1-003 个位数统计 (15分) 给定一个 \(k\) 位整数 \(N=d_{k-1}10^{k-1}+?+d_110^1+d_0(0 \leqslant d_1 \leqslant 9,i=0,?,k-1,d_{k-1} \gt 0)\),请编写程序统计每种不同的个位数字出现的次数.例如:给定 \(N=100311\),则有 \(2\) 个 \(0\),\(3\) 个 \(1\),和 \(1\) 个 \(3\). 输入格式: 每个输入包含 \(1\) 个测试用例,即一个不超过 \(1000

7-1 词频统计 (30 分)

词频统计 参考: 对参考的代码进行了一些补充和修改,大体思路没变 并不是想说这题多难,只是在这题可以用STL的很多结构帮助解题,所以能让代码变得很简单 题目 请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词. 所谓"单词",是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符.而合法的"单词字符"为大小写字母.数字和下划线,其它字符均认为是单词分隔符. 输入格式: 输入给出一段非空文本,最后

PAT-字符串处理-B1021 个位数统计 (15分)

题目: 思路: 由题得知输入得正整数位数很大,故超出C++整型的范围,于是使用字符串数组进行存储.另外使用一个数组对输入数字的个位数字进行统计,然后进行输出 注意点: 字符串数组中,每个位置存储的元素的类型为char类型,故利用ASCLL码获取其在C++中的整型数字,res[num[i]-'0']++,其中num[i]-'0'为输入数字的其中一个数字 代码: 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std

【动态规划】bzoj3992 [Sdoi2015]序列统计 10分

#include<cstdio> using namespace std; #define MOD 1004535809 int a[8001],f[1001][101],n,m,x,S; int main() { scanf("%d%d%d%d",&n,&m,&x,&S); for(int i=1;i<=S;++i) { scanf("%d",&a[i]); a[i]%=m; ++f[1][a[i]]; }

P2234 [HNOI2002]营业额统计(50分。。。。)

50 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 50007 #define inf 0x7fffffff using namespace std; int n,a[N],d[N],ans; struct Data { int x,ord; }data[N]; struct tree { int l,r,mn,mx,sum; }tr[N

1021 个位数统计 (15 分)

题目: 思路: 定义一个整型数组进行计数,其下标对应的数组值就是数字0~9相应出现的次数. 代码(C++版): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() 6 { 7 string n; 8 cin >> n; 9 int cnt[10] = {0}; 10 for(int i = 0; i < n.length(); i++) 11 { 12 cn

1021 个位数统计 (15分)

#include <iostream> #include <string.h> using namespace std; int main() { char n[1002]; int num[11]; int c[11]={0}; int tmp; cin>>n; for(int i=0;i<=9;i++) num[i]=i; for(int i=0;i<strlen(n);i++) { tmp=n[i]-48; c[tmp]++; } for(int i=