大致题意:

给出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 ",'*');elseprintf("%.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",'*');elseprintf("%.7f\n",ans[cnt2-1]);}return 0;
}

转载于:https://www.cnblogs.com/pach/p/6979172.html

Gym 101334A Area 51 数学相关推荐

  1. 计算机中语言的log与数学中的log的区别

    1, 结论: 计算机语言中的log直接就是求一个数的自然对数,就是以e为底的: 数学上的log是必须指明底的,但lg是以10为底的,如 lg 10=1.以e为底的写为: logex, 其中e是写在底下 ...

  2. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  3. python3基础入门巩固94题--源自github

    前言:本篇文章适合刚入门python看完视频感觉自己还是不会敲的同学学习,都比较简单,代码量很少:这些题目题分为三个等级,但是我做到25题之后就没有分级了,后面的分级是我自己分的. github源地址 ...

  4. 关于shell脚本的知识点总结

    文章目录 shell编程 一.初识shell shell 定义 shell的分类和切换 使用场景 shell 特性回顾 bash 初始化 二.shell 脚本规范 三.变量的类型 练习1 练习2 四. ...

  5. leetcode - Container With Most Water

    题目链接:http://oj.leetcode.com/problems/container-with-most-water/ 第一个解法是用两个数组双向记录.方法的时间复杂度是O(n+max).这里 ...

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

    摘要:同时使用Linux和Windows平台产品,大量使用静态的方法和类,Stack Overflow是个重度性能控.同时,取代横向扩展,他们坚持着纵向扩展思路,因为"硬件永远比程序员便宜& ...

  7. TYUT-A专题题解(二)

    TYUT-A专题题解(一) TYUT-A专题题解(二) 36暴力枚举 AOJ0008 Sum of 4 Integers[暴力]_海岛Blog-CSDN博客 HDU1407 测试你是否和LTC水平一样 ...

  8. dell4528s linux_如何在戴尔PC上使用Ubuntu Linux终端

    文章内容 症状 以下文章提供有关在 Ubuntu Linux 中使用终端 Shell 的信息.如何找到有关终端中提供的多个命令的使用方式的更多信息. 目录: 本文中将说明如何使用内置的终端命令来提供有 ...

  9. 华东师范大学计算机模拟试题,华东师范大学计算机机试真题

    华东师范大学计算机机试真题 2009机试2 计算和的数位2 大写改小写3 素数对4 求最大公约数和最小公倍数6 排序后求位置处的数7 *路由器连接8 *编译原理10 *分开连接13 2010机试17 ...

最新文章

  1. 树状数组与离散化与求第K大模板
  2. 提高Service提高进程优先级别,不被系统容易杀死
  3. 程序员怎样成为一名架构师?
  4. 读再多书都没觉得自己变强?试试我这“5年陈”的方法
  5. Java中implies_boolean implies(Permission p)
  6. java etcd api_在java中如何使用etcd的v2 和v3 api获取配置,并且对配置的变化进行监控和监听...
  7. 【飞控理论】从零开始学习Kalman Filters之一:Kalman Filters的常见用途、什么是状态观测器?
  8. Linux基础—4.Linux系统管理命令【由图有真相】
  9. 4. JavaScript Math 对象
  10. android 地理位置改变,Android中修改地理位置信息
  11. Nmap内网扫描端口
  12. c语言银行卡六位密码编译,用c语言生成六位的随机密码。
  13. 见过这么有才的笑话吗?
  14. c语言3f,C语言%.4f与%3f代表是什么意思?
  15. 实现virtual box虚拟机窗口全屏显示
  16. 学习要有但行好事,莫问前程的心态
  17. HDU 4489(DP)
  18. 哈尔滨工业大学计算机系统大作业--程序人生
  19. TcaplusDB君 · 行业新闻汇编(12月25号)
  20. java的日历类_java 中的Calendar日历类

热门文章

  1. app.config中增加appSettings节点,conn.open时报初始化错误
  2. Java 理论与实践: 修复 Java 内存模型,第 2 部分 (VOLATILE, FINA...
  3. Javascript实现复选框(全选反选功能)
  4. ProcessDialogKey 方法实现回车自动换行
  5. AutoCAD WS API发布【转】
  6. 记录一下,以后学Python
  7. [Angular 2] @ngrx/devtools demo
  8. laravel创建新model数据的两种方法
  9. javascript 面试题
  10. J2SE,J2ME,J2EE解释