Gym 101334A Area 51 数学

大致题意:

给出n个建筑的二维坐标,每个建筑名称为一个字母,不同坐标的建筑可以有同一名称,并保证这些坐标都是在y轴上半轴。给出一串建筑名称的字符串,在X轴上找出一个或多个区间,使Nick在这个区间上从左往右观看,看到的建筑顺序与给出的字符串相符合。

分析:

建筑物的数量最多100,那么我们可以先求出任意两点的连线与X轴的交点,每两个相邻的交点间的开区间看到的顺序是相同的。那么我们枚举所有区间即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define eps 1e-9
using namespace std;

const int maxn=100+5;
const int INF=1e5;
int n;
char s[maxn];
double cosA[maxn];
double p[maxn*maxn];
double ans[maxn*maxn];

struct Facility
{
    char c;
    int x;
    int y;
}fac[maxn];

struct Angle
{
    char c;
    double cosA;
}ang[maxn];

bool cmp(Angle a,Angle b)
{
    return a.cosA<b.cosA;
}

bool judge(double o)
{
    for(int i=0;i<n;i++)
    {
        ang[i].c=fac[i].c;
        ang[i].cosA=(fac[i].x-o)/sqrt(fac[i].y*fac[i].y+(fac[i].x-o)*(fac[i].x-o)); //算区间中点与建筑的连线与X轴正方向的夹角的余弦值
    }
    sort(ang,ang+n,cmp);
    for(int i=0;i<n;i++)
        if(ang[i].c!=s[i])
            return false;
    return true;
}

int main()
{
//    freopen("in.txt","r",stdin);
//    freopen("area.in","r",stdin);
//    freopen("area.out","w",stdout);
    while(~scanf("%d",&n))
    {
        getchar();
        scanf("%s",s);
        for(int i=0;i<n;i++)
        {
            getchar();
            scanf("%c%d%d",&fac[i].c,&fac[i].x,&fac[i].y);
        }
        p[0]=-INF;
        int cnt=1;
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                if(fac[i].y==fac[j].y) continue;
                p[cnt++]=1.0*(fac[j].x*fac[i].y-fac[i].x*fac[j].y)/(fac[i].y-fac[j].y);
            }
        }
        p[cnt++]=INF;
        sort(p,p+cnt);
        int cnt2=0;
        for(int i=0;i<cnt-1;i++)
        {
            if(p[i+1]-p[i]<eps) continue;
            if(judge((p[i]+p[i+1])/2))  //去区间中点来判断此区间是否合法
            {
                ans[cnt2++]=p[i];
                ans[cnt2++]=p[i+1];
            }
        }
        printf("%d\n",cnt2/2);
        if(cnt2==0) continue;
        if(fabs(ans[0]-p[0])<eps)
            printf("%c ",‘*‘);
        else
            printf("%.7f ",ans[0]);
        for(int i=1;i<cnt2-1;i++)
            printf("%.7f ",ans[i]);
        if(fabs(ans[cnt2-1]-p[cnt-1])<eps)
            printf("%c\n",‘*‘);
        else
            printf("%.7f\n",ans[cnt2-1]);
    }
    return 0;
}
时间: 2024-10-12 19:08:04

Gym 101334A Area 51 数学的相关文章

创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S

题目补充: 创建一个接口Shape,其中有抽象方法area,类Circle .Rectangle实现area方法计算其面积并返回. 又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar: 在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象: 如是2,生成Rectangle对象:如是3,生成Star对象).然后将Vector中元素依次取出,判断其是否为Star类.如是返回其

【转载】看StackOverflow如何用25台服务器撑起5.6亿的月PV

问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 亿 PV,但只用 25 台服务器,并且 CPU 负荷并不高. 它没有使用云计算,因为云计算可能会拖慢速度,更难优化和更难排除系统故障. StackOverflow 仍然使用微软的架构,它非常实际,微软的基础设施能有效工作,又足够廉价,没有令人信服的理由需要做出改变.但这并不表示它不使用 Linux,它

.NET技术+25台服务器怎样支撑世界第54大网站

英文原文:StackOverflow Update: 560M Pageviews A Month, 25 Servers, And It's All About Performance StackOverflow 是一个 IT 技术问答网站,用户可以在网站上提交和回答问题.当下的 StackOverflow 已拥有 400 万个用户,4000 万个回答,月 PV5.6 亿,世界排行第 54.然而值得关注的是,支撑他们网站的全部服务器只有 25 台,并且都保持着非常低的资源使用率,这是一场高有效

C#读写二进制文件

原文 本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件.第一步:读写文件转成流对象.其实就是读写文件流 (FileStream对象,在System.IO命名空间中).File.FileInfo.FileStream这三个类可以将打开文件,并变成文件 流.下面是引用微软对File.FileInfo.FileStream的介绍System.IO.File类 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象.System.IO.File

14PKUkaoyan

准考证号 政治 政治分 外语 外语分 科目1 科目1分 科目2 科目2分 总分 专业代码 专业名称 专业名次 考试方式 报名号 100014014170001 思想政治理论 63 英语一 57 数学(一) 84 数字电路逻辑设计 133 337 085208 电子与通信工程 7 全国统考 110192162 100014014170002 思想政治理论 63 英语一 55 数学(一) 49 数字电路逻辑设计 102 269 085208 电子与通信工程 28 全国统考 110199995 100

(转).NET技术+25台服务器怎样支撑世界第54大网站

英文原文:StackOverflow Update: 560M Pageviews A Month, 25 Servers, And It's All About Performance StackOverflow 是一个 IT 技术问答网站,用户可以在网站上提交和回答问题.当下的 StackOverflow 已拥有 400 万个用户,4000 万个回答,月 PV5.6 亿,世界排行第 54.然而值得关注的是,支撑他们网站的全部服务器只有 25 台,并且都保持着非常低的资源使用率,这是一场高有效

Python中的库使用之一 PIL

先上代码:本文主要工给自己参考,在需要的时候直接搜索查找就行了,不想看没有实际运行例子的文档,当参考完这部分还哦未能解决问题在参考PIL的相关文档! 1 Skip to content 2 This repository 3 Search 4 Pull requests 5 Issues 6 Gist 7 @mm1994uestc 8 Unwatch 1 9 Star 0 10 Fork 0 mm1994uestc/PythonImageProcessing 11 Code Issues 0 P

深入理解Web Server原理----在CC3200 WiFi模块上构建轻量级Web Server

作为博客园的处女作,本文将引导大家理解Web Server的原理. Table of contents 常见Web Server及其功能 低功耗WiFi 嵌入式Web Server的应用 Energia Project无缝支持Arduino框架在TI LaunchPad上的扩展 基于CC3200如何构建一个嵌入式Web Server 做过Web开发的同学都知道,Web Server是用来处理http(POST.GET.PUT.DELETE等)请求的系统,有大名鼎鼎的Apache http Ser

看StackOverflow如何用25台服务器撑起5.6亿的月PV

问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 亿 PV,但只用 25 台服务器,并且 CPU 负荷并不高. 它没有使用云计算,因为云计算可能会拖慢速度,更难优化和更难排除系统故障. StackOverflow 仍然使用微软的架构,它非常实际,微软的基础设施能有效工作,又足够廉价,没有令人信服的理由需要做出改变.但这并不表示它不使用 Linux,它