Codeforces Gym 100463D Evil DFS

来源:互联网 发布:mac版同花顺公式 编辑:程序博客网 时间:2024/05/17 22:36

题目链接:

http://codeforces.com/gym/100463

题意:

给你一个坐标系,上面有n个点,要求找到一个矩形,使得能够框住一半的红点,不框进任何一个蓝点,求最小矩形面积

题解:

暴力枚举,注意,矩形面积可以为0

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e5+10;int n,num1,num2,ans;struct node{    int x,y;}a[25],b[25];bool check(int xl,int xr,int yl,int yr){    for(int i=1; i<=num2; i++){        if((b[i].x>=xl&&b[i].x<=xr) && (b[i].y>=yl&&b[i].y<=yr))            return false;    }    return true;}void dfs(int u, int pre, int xmin,int xmax,int ymin,int ymax){    if(u >= (num1)/2+1){        if(check(xmin,xmax,ymin,ymax))            ans = min(ans,(xmax-xmin)*(ymax-ymin));        return ;    }    for(int i=pre+1; i<=num1; i++){        dfs(u+1, i, min(xmin,a[i].x),max(xmax,a[i].x),min(ymin,a[i].y),max(ymax,a[i].y)); // 前驱等于后继的时候 考虑只有一个点的情况 也就是矩形面积为零    }}int main(){    int cas = 0;    while(scanf("%d",&n),n){        num1=num2=0;        cas++;        ans = INF;        for(int i=1; i<=n; i++){            int x=read(),y=read(),c=read();            if(c == 0)                a[++num1].x=x,a[num1].y=y;            else                b[++num2].x=x,b[num2].y=y;        }        dfs(1,0,INF,-INF,INF,-INF);        if(ans != INF)            cout << "Case " << cas << ": " << ans << endl;        else            cout << "Case " << cas << ": " << -1 << endl;    }    return 0;}
0 0
原创粉丝点击