Dying Light

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 513    Accepted Submission(s): 122

Problem Description

LsF
is visiting a local amusement park with his friends, and a mirror room
successfully attracts his attention. Inside the mirror room, there are n
plane mirrors standing vertically on the ground. They are placed
end-to-end and face-to-face so that if you overlook the room, you can
find a convex hull and the all the reflector surfaces are inside the
pattern. The height of the mirror is not important in this problem.
Due
to imperfect manufacturing techniques, mirrors can't reflect light
without lose of energy. Each mirror has a reflection efficiency k, which
means if the incident light's intensity is I, the reflected light's
intensity will be reduced to kI. The only exception could happen when
the light precisely goes to the two mirrors' junction. In that case, the
light will be completely absorbed instantly. Note the laws of
reflection of light applies in all other situations, that the angle of
incidence equals the angle of reflection.
Now LsF stands inside the
mirror hall, and shoots a laser beam paralleled to the ground using his
laser pointer. Unfortunately, his laser pointer can only shot laser
beams with intensity of 1. What's worse, a laser beam is considered
disappeared if its intensity is below 10−4. There's not much magnitude distance between the two numbers.
LsF wants to know how many touches can his laser beam make with mirrors before it disappears.
 
Input
The first line contains an integer n(3≤n≤1000), indicating the number of mirrors;
Then n lines follow. The ith line contains three real numbers xi,yi,ki(−109≤xi,yi≤109;0≤ki≤0.9), which means the ith mirror's one end is at position (xi,yi) and another end is at (xi+1mod n,yi+1mod n), and its reflectivity is ki.
Next there are two real numbers Vx,Vy(-109≤Vx,Vy≤109), indicating the initial direction vector of the laser beam.
LsF is standing at the origin (0, 0).

 
Output
Output an integer in one line, the number of touches the laser beam could make before it disappears.
 
Sample Input
4
1 2 0.5
-1 0 0.5
1 -2 0.5
3 0 0.5
0 1
4
1 1 0.5
-1 1 0.5
-1 -1 0.5
1 -1 0.5
1 1
Sample Output
14
1
Source
分析:由于LsF一开始不再镜子上,按题面模拟即可。
由于反射率<=0.9 0.9^100<1e-4,所以反射次数不会超过100次。
每次暴力判断和哪个镜子相交,以及有没有在镜子焦点上。
下面给出AC代码:
 #include <cstring>
#include <algorithm>
#include <cstdio>
#include <iostream> #define MAXN 5000
#define eps 1e-9 struct point
{
double x,y;
point(double a = ,double b = )
{
x = a; y = b;
}
friend point operator + (point a,point b)
{
return point(a.x+b.x,a.y+b.y);
}
friend point operator - (point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
friend double operator ^ (point a,point b)
{
return a.x*b.y-a.y*b.x;
}
friend double operator * (point a,point b)
{
return a.x*b.x+a.y*b.y;
}
friend point operator * (point a,double b)
{
return point(a.x*b,a.y*b);
}
friend point operator * (double a,point b)
{
return point(a*b.x,a*b.y);
} }; struct line
{
point s,e;
line(point a = point(,),point b = point(,))
{
s = a; e = b;
}
}; point p[MAXN+];
double c[MAXN+];
int n;
point s[]; int sgn(double x)
{
if (x>eps) return ;
if (x<-eps) return -;
return ;
} point Get_Intersect(line a,line b)
{
double u=(a.e-a.s)^(b.s-a.s);
double v=(a.s-a.e)^(b.e-a.e);
point p;
p.x=(b.s.x*v+b.e.x*u)/(v+u);
p.y=(b.s.y*v+b.e.y*u)/(v+u);
return p;
} int main()
{
// freopen("input.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{for (int i=;i<n;i++) scanf("%lf%lf%lf",&p[i].x,&p[i].y,&c[i]);
p[n] = p[];
s[] = point(,);
scanf("%lf%lf",&s[].x,&s[].y); double now = 1.0;
int ans = ;
bool flag = ;
point temp;
point temp2;
line l1,l2,l3,l4;
while (now > 1e-)
{
ans++;
for (int i=;i<n;i++)
{
if (!sgn((p[i]-s[])^s[]))
{
now = ;
flag = ;
break;
}
}
if (!flag) break;
for (int i=;i<n;i++)
{
if (sgn((p[i]-s[])^s[]) > && sgn(s[]^(p[i+]-s[]))>)
{
l1 = line(p[i+],p[i]);
l2 = line(s[],s[]+s[]);
temp = Get_Intersect(l1,l2); l3 = line(temp,point(p[i+].y-p[i].y,p[i].x-p[i+].x)+temp);
l4 = line(s[],point(p[i].x-p[i+].x,p[i].y-p[i+].y)+s[]); temp2 = Get_Intersect(l3,l4);
temp2 = *temp2-s[];
s[] = temp;
s[] = temp2-s[];
now *= c[i];
break;
}
}
}
printf("%d\n",ans);
}
return ;
}

2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】的更多相关文章

  1. 2017 Multi-University Training Contest - Team 1 1002&&hdu 6034

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】

    CSGO Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】

    Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  5. 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  6. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  8. 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  9. 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】

    KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

随机推荐

  1. selenium python自动化简明演示

    1.selenium安装: pip install -U selenium参考:https://pypi.python.org/pypi/selenium#downloads2.下载firefox驱动 ...

  2. 从初识Maven到使用Maven进行依赖管理和项目构建

    前些天就安装了Maven,以备自己以后整合项目用,尤其是我们的ssh,ssm项目.想必好多人在开始的时候并不清楚Maven是什么,它能够帮助我们干什么. 所以在学习Maven之前我们一定要知道它是什么 ...

  3. APP的线程安全

    一般来说iOS中两个就够了,但是安卓中的第三个,iOS也是要注意的: 第一:网络方面,别人以为做数据请求用post会比get请求安全,但是这是错的,post请求虽然看起来你的请求是在请求体上,不像ge ...

  4. HTML的三种布局:DIV+CSS、FLEX、GRID

    Div+css布局 也就是盒子模型,有W3C盒子模型,IE盒子模型.盒子模型由四部分组成margin.border.padding.content. 怎么区别这两种模型呢,区别在于w3c中的width ...

  5. java获取当前应用的运行信息(内存,线程,运行时间,状态等)

    一:目的 写这一段程序的原因是需要监控部署的的应用是否正常运行,并且显示其运行状态.在进程莫名死掉后甚至可以自动启动该应用. 首先这段代码可以获取的信息如下 /** * 当前进程运行的主机名 */ p ...

  6. bat获取系统时间修改系统密码

    @echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe&q ...

  7. springBoot系列教程06:参数验证及验证信息国际化

    在springboot应用中要验证参数是否正确很简单,web应用已经包含了validation的 1.定义需要被验证的参数实体,并用注解标明错误类别和错误信息 package com.xiao.dom ...

  8. sql sever[基本] ''增删改'' 随笔

    结构语言分类 DDL(数据定义语言)  create  drop  alter   创建删除以及修改数据库,表,存储过程,触发器,索引.... DML(数据操作语言)   insert  delete ...

  9. 房上的猫:StringBuffer类

    一.使用StringBuffer类 StringBuffer类位于java.lang包中,是String类的增强类 步骤:  1.声明StringBuffer对象并初始化 StringBuffer s ...

  10. Head First设计模式之访问者模式

    一.定义 定义:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操 ...