UVaLive 7461 Separating Pebbles (暴力)

题意:给出平面上的两类点,判断是否能画一条直线将两类点完全分割开来.

析:用暴力去枚举任意两点当作直线即可。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const LL LNF = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e3 + 100;
const int mod = 1e9 + 7;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
const char *Hex[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
}
struct node{
    int x, y, val;
    bool operator < (const node &p) const{
        return val < p.val;
    }
};
node a[255];

int judge(const node &p1, const node &p2, const node &p3){
    return (p1.x-p3.x) * (p2.y-p3.y) - (p1.y-p3.y) * (p2.x-p3.x);
}
bool cmp(const node &p, const node &q){
    return p.x < q.x || (p.x == q.x && p.y < q.y);
}

bool solve(int s, int t){
    int x = 0, y = 0;
    vector<node> v;
    for(int i = 0; i < n; ++i){
        if(i == s || t == i)  continue;
        if(!judge(a[s], a[t], a[i])){ v.push_back(a[i]);  continue; }
        if(judge(a[s], a[t], a[i]) > 0 && !a[i].val){
            if(!x) x = 1, y = -1;
            else if(x < 0)  return false;
        }
        else if(judge(a[s], a[t], a[i]) < 0 && !a[i].val){
            if(!x)  x = -1, y = 1;
            else if(x > 0)  return false;
        }
        else if(judge(a[s], a[t], a[i]) > 0 && a[i].val){
            if(!y)  y = 1, x = -1;
            else if(y < 0)  return false;
        }
        else if(judge(a[s], a[t], a[i]) < 0 && a[i].val){
            if(!y)  y = -1, x = 1;
            else if(y > 0)  return false;
        }
    }

    if(!v.size()) return true;
    int ok = 0;
    v.push_back(a[s]);
    v.push_back(a[t]);
    sort(v.begin(), v.end(), cmp);
    int cnt = 0;
    for(int i = 0; i < v.size(); ++i){
        if(v[i].val && !ok){
            ok = 1;
        }
        else if(!v[i].val && !ok){
            ok = -1;
        }
        else if(v[i].val && ok == -1){
            ok = 1;
            ++cnt;
        }
        else if(!v[i].val && ok == 1){
            ok = -1;
            ++cnt;
        }
        if(cnt > 1) return false;
    }
    return true;
}

int main(){
    int T;  cin >> T;
    while(T--){
        scanf("%d", &n);
        for(int i = 0; i < n; ++i){
            scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].val);
        }
        bool ok = false;
        for(int i = 0; i < n; ++i){
            for(int j = i+1; j < n; ++j)
                if(solve(i, j)){ ok = true;  break; }
            if(ok)  break;
        }

        printf("%d\n", ok);
    }
    return 0;
}
时间: 2024-12-13 04:50:03

UVaLive 7461 Separating Pebbles (暴力)的相关文章

Gym 100299C &amp;&amp; UVaLive 6582 Magical GCD (暴力+数论)

题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点时,我们对gcd相同的只保留一个,那就是左端点最小的那个,只有这样才能保证是最大,然后删掉没用的. UVaLive上的数据有问题,比赛时怎么也交不过,后来去别的oj交就过了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&qu

UVaLive 3401 Colored Cubes (暴力)

题意:给定n个立方体,让你重新涂尽量少的面,使得所有立方体都相同. 析:暴力求出每一种姿态,然后枚举每一种立方体的姿态,求出最少值. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostrea

UESTC 2014 Summer Training #19

A.UVALive 6161 去迟了,队友已经开始写了,应该是个水题,贴个队友代码 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #inclu

hdu多校第一场 1013(hdu6590)Code 凸包交

题意: 给定一组(x1,x2,y),其中y为1或0,问是否有一组(w1,w2,b),使得上述的每一个(x1,x2,y)都满足x1*w1+x2*w2+b在y=1时大于0,在y=-1时小于0. 题解: 赛时想的是半平面交,wa到哭 后来看题解,居然那么简单? 我们把x1,x2看成两个坐标轴,那么其实(w1,w2,b)对应着一条直线,x1*w1+x2+w2+b=0,那么令这个值大于0的必定在这条直线一边,令这个值小于0的必定在这个直线另一边.这道题也就是在问,有没有一条线能分隔开这两种点. 那么把这两

UVALive 6163(暴力枚举)

这道题我的做法就是枚举这四个数的所有排列所有运算所有计算顺序. 略有考验代码能力,不能漏掉情况,注意模块化的思想,一些功能写成函数调试的时候结构清晰好分析. 比赛时没有AC是对next_permutation()函数理解的不透,根本没有想到是没有从最小字典序开始枚举的问题. 就是next_permutation()函数是从当前顺序枚举到字典序最大的,而我开始时do里面的a数组不一定是字典序最小的,但是next_permutation()函数一定是从当前字典序往最大的枚举,所以漏掉了字典序很小的那

UVALive 2145 Lost in Space(暴力)

题目并不难,就是暴力,需要注意一下输出形式和精度. #include<iostream> #include<cstdio> #include<cmath> using namespace std; #define maxn 100 #define jd 0.0001 double x[maxn],y[maxn],z[maxn],d,e,f; double getdis(double x,double y,double z,double x1,double y1,doub

UVALive 5844 dfs暴力搜索

题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于等于15.所以.对第一个字符串里的每一个字符尝试匹配1-k个字符看是否有可能相等就好了. 比赛的时候想到这是dfs类暴力,但是map<char, char*>没用过.不知道怎么记录了.而且dfs本身就不太会用.依然感觉dfs很奇妙. #include <iostream> #inclu

UVaLive 7456 Least Crucial Node (并查集+暴力)

题意:求标号最小的最大割点.(删除该点后,指定点#sink能到达的点数减少最多). 析:由于不知道要去掉哪个结点,又因为只有100个结点,所以我们考虑用一个暴力,把所有的结点都去一次,然后用并查集去判断. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #includ

UVAlive 6623 Battle for Silver(暴力+思路)

题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4634 思路:图中两条边之间不能交叉,则最终的选择的点集中的点只能有1,2,3,4个,暴力枚举即可. #include<cstdio> #include<cstring> #include<iostream> #include<