Uva221 Urban Elevations /离散化思想

主要大意:给几个立体的矩形块,判断在某一方向能看到哪几个矩形块

注意点:    1.离散化思想,由于是实数点,不可能把所有的点都遍历一遍
所以我们只能将所有的x坐标和x+width坐标排序并去重,相邻两个坐标之间看作一个遍历的位置。
这个区间要么完全可见,要么完全不可见。
如果对任意一个矩形块,这个位置可见,并且前方没有能完全遮住它的矩形块(y < it && heigh >= it),那么这个矩形块就是可见的。
    离散化:无限变为有限。这题里即将无限的点变为有限的区间。
        2.unique:在STL中unique函数是一个去重函数
         unique的功能是去除相邻的重复元素(只保留一个)
         其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,
         然后 返回去重后最后一个元素的地址。

继续刷紫书,还是用的紫书的方法。

#include <bits/stdc++.h>
using namespace std;
#define maxn 150

struct mess
{
    double x,y,wid,dep,hei;
    int id;
    mess(double a,double b,double c,double d,double e)
    {
         x = a; y = b; wid = c; dep = d; hei = e;
    }
    mess(){}
}house[maxn];

double x[maxn*2];
bool cmp(mess a,mess b)
{
    if(a.x == b.x)
        return a.y < b.y;
    else return a.x < b.x;
}
int cover(int id,double mx)
{
    if(house[id].x <= mx && (house[id].x+house[id].wid) >= mx)
        return 1;
    else return 0;
}
int m,xnum;
int ok(int id)
{
    int flag = 0;
    for(int i = 0; i < xnum-1; i++)
    {
        double half = (double)(x[i] + x[i+1])/2;
        if(!cover(id,half)) continue;
        int mark = 0;
        for(int j = 0; j < m ; j++)
        {
            if(cover(j,half) && house[j].y < house[id].y && house[j].hei >= house[id].hei)
            {
                mark = 1;
                continue;
            }
        }
        if(mark == 0) return 1;
    }
    return 0;
}

int main()
{

    int num = 1;
    while(scanf("%d",&m) && m)
    {
        for(int i = 0; i < m ; i++)
        {
            double a,b,c,d,e;
            scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e);
            house[i] = mess(a,b,c,d,e);
            house[i].id = i+1;
            x[2*i] = a;
            x[2*i+1] = a+c;
        }
        sort(house,house+m,cmp);
        sort(x,x+2*m);
        xnum = unique(x,x+2*m) - x;
        if(num != 1)
            printf("\n");
        printf("For map #%d, the visible buildings are numbered as follows:\n",num++);
        int inum = 0;
        for(int i = 0; i < m; i++)
        {
            //cout<<"i id "<<i<<' '<<house[i].id<<endl;
            if(ok(i) && inum != 0)
                printf(" %d",house[i].id);
            else if(ok(i) && inum == 0)
            {
                inum++;
                printf("%d",house[i].id);
            }

        }
        printf("\n");

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[入门数据分析的第一堂课]这是一门为数据分析小白量身打造的课程,你从网络或者公众号收集到很多关于数据分析的知识,但是它们零散不成体系,所以第一堂课首要目标是为你介绍:Ø  什么是数据分析-知其然才知其所以然Ø  为什么要学数据分析-有目标才有动力Ø  数据分析的学习路线-有方向走得更快Ø  数据分析的模型-分析之道,快速形成分析思路Ø  应用案例及场景-分析之术,掌握分析方法[哪些同学适合学习这门课程]想要转行做数据分析师的,零基础亦可工作中需要数据分析技能的,例如运营、产品等对数据分析感兴趣,想要更多了解的[你的收获]n  会为你介绍数据分析的基本情况,为你展现数据分析的全貌。让你清楚知道自己该如何在数据分析地图上行走n  会为你介绍数据分析的分析方法和模型。这部分是讲数据分析的道,只有学会底层逻辑,能够在面对问题时有自己的想法,才能够下一步采取行动n  会为你介绍数据分析的数据处理和常用分析方法。这篇是讲数据分析的术,先有道,后而用术来实现你的想法,得出最终的结论。n  会为你介绍数据分析的应用。学到这里,你对数据分析已经有了初步的认识,并通过一些案例为你展现真实的应用。[专享增值服务]1:一对一答疑         关于课程问题可以通过微信直接询问老师,获得老师的一对一答疑2:转行问题解答         在转行的过程中的相关问题都可以询问老师,可获得一对一咨询机会3:打包资料分享         15本数据分析相关的电子书,一次获得终身学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值