Description

给出一个nnn个点的凸多边形,每条边都是一面镜子,顶点为(x0,y0),...,(xn−1,yn−1)" role="presentation" style="position: relative;">(x0,y0),...,(xn−1,yn−1)(x0,y0),...,(xn−1,yn−1)(x_0,y_0),...,(x_{n-1},y_{n-1}),第iii条边起点为(xi,yi)" role="presentation" style="position: relative;">(xi,yi)(xi,yi)(x_i,y_i),终点为(x(i+1)%n,y(i+1)%n)(x(i+1)%n,y(i+1)%n)(x_{(i+1)\%n},y_{(i+1)\%n}),第iii面镜子折射率为ki" role="presentation" style="position: relative;">kikik_i,折射率定义为一束光强为III的光线从该面镜子上反射后光强变为KI" role="presentation" style="position: relative;">KIKIKI,原点位于凸多边形内,从原点开始沿(vx,vy)(vx,vy)(v_x,v_y)方向发射一束单位光强的光线,在镜面间不停反射直至光强小于10−410−410^{-4},问这期间反射了多少次

Input

第一行一整数nnn表示顶点数,之后n" role="presentation" style="position: relative;">nnn行每行输出两个整数(xi,yi)(xi,yi)(x_i,y_i)表示第iii个点的横纵坐标和一个浮点数ki" role="presentation" style="position: relative;">kikik_i表示第iii面镜子的折射率,最后输入两个整数vx,vy" role="presentation" style="position: relative;">vx,vyvx,vyv_x,v_y表示初始光线的入射方向(3≤n≤1000,−109≤xi,yi≤109,0≤ki≤0.9)(3≤n≤1000,−109≤xi,yi≤109,0≤ki≤0.9)(3\le n\le 1000,-10^9\le x_i,y_i\le 10^9,0\le k_i\le 0.9)

Output

输出光强小于10−410−410^{-4}之前的反射次数

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

Solution

由于0.988<10−40.988<10−40.9^{88},故反射次数不会太多,每次暴力判断哪块镜面反射然后修改光线的起点和方向即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define maxn 1005
#define eps 1e-8
struct Point
{double x,y;Point(){}Point(double _x,double _y){x=_x;y=_y;}Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}double operator ^(const Point &b)const{return x*b.y-y*b.x;}double operator *(const Point &b)const{return x*b.x+y*b.y;}Point operator *(const double &b)const{return Point(x*b,y*b);}
};
struct Line
{Point s,e;Line(){}Line(Point _s,Point _e){s=_s;e=_e;}
};
//判断x的符号
int sign(double x)
{if(fabs(x)<eps) return 0;if(x<0) return -1;return 1;
}
Point Intersection(Line a,Line b)
{Point ans;double u=(a.e-a.s)^(b.s-a.s),v=(a.s-a.e)^(b.e-a.e);ans.x=(b.s.x*v+b.e.x*u)/(v+u);ans.y=(b.s.y*v+b.e.y*u)/(v+u);return ans;
}
Point p[maxn],S,T;
double k[maxn];
int n;
int main()
{while(~scanf("%d",&n)){for(int i=0;i<n;i++)scanf("%lf%lf%lf",&p[i].x,&p[i].y,&k[i]);p[n]=p[0];S=(Point){0,0};scanf("%lf%lf",&T.x,&T.y);int ans=0;double num=1.0;while(1){if(num<1e-4)break;ans++;int flag=1;for(int i=0;i<n;i++)if(sign((p[i]-S)^T)==0){flag=0;break;}if(!flag)break; for(int i=0;i<n;i++)if(sign((p[i]-S)^T)>0&&sign((p[i+1]-S)^T)<0){Line l1=Line(S,S+T),l2=Line(p[i],p[i+1]);Point p1=Intersection(l1,l2);l1=Line(p1,Point(p[i+1].y-p[i].y,p[i].x-p[i+1].x)+p1);l2=Line(S,p[i+1]-p[i]+S);Point p2=Intersection(l1,l2);p2=p2*2-S;S=p1,T=p2-p1;num*=k[i];break;}}printf("%d\n",ans);}return 0;
}

HDU 6164 Dying Light(计算几何)相关推荐

  1. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  2. hdu 5964:平行四边形 【计算几何】

    打重现赛时,一点思路也没有,然后又看到这题AC数那么少,就直接放弃了.今天重新看了看,借鉴了下别人的,发现此题应该算是一道可解题. 看上去,这题的ans是同时有两个点作为自变量的函数(然而n^2复杂度 ...

  3. hdu 4667 Building Fence 计算几何模板

    1 //大白p263 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 #include ...

  4. HDU 4380 Farmer Greedy 计算几何+bitset

    枚举直线,对于直线的某个点在直线的左端还是右端,能够状压出一个数.用bitset记录. 然后三角形就是3个bitset&一下 #include <cstdio> #include ...

  5. HDU 3698-Let the light guide us(线段树+DP)愿圣光忽悠你

    题意: 给定两个矩阵,第一个矩阵代表时间,第二个矩阵代表距离.给出约束的公式,询问在每一行都造一个圣光塔最少花费多少时间! 思路: 对于题目中给的条件 |J-K| <=f[i][j] +f[i+ ...

  6. 算法竞赛入门与进阶 (二)单调队列、单调栈

    栈(stack)和队列( queue ) 1.栈的定义:栈是限定仅在表头进行插入和删除操作的线性表(先进后出) 2.队列的定义:队列是一种特殊的线性表,特殊之处在于 它只允许在表的前端(front)进 ...

  7. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  8. 金属,塑料,傻傻分不清楚

    https://zhuanlan.zhihu.com/p/21961722 很多时候可以听到游戏玩家说,某某游戏看起来什么都是塑料做的.最近还听一个设计师说,你用Blinn-Phong吧,那东西渲染出 ...

  9. 91Android万能驱动最新版,NVIDIA万能驱动电脑版下载|NVIDIA万能驱动官方安装版下载 -爱安卓...

    NVIDIA万能驱动,NVIDIA万能驱动电脑版下载,NVIDIA万能驱动官方安装版下载NVIDIA日前发布了最新公版驱动下载,可确保用户获得最佳的游戏体验,驱动程序还提供了针对各种不同游戏的性能提升 ...

  10. 80句经典英文电影台词,英语作文最佳素材

    Gone with the wind <乱世佳人> After all, tomorrow is another day! 不管怎样,明天是新的一天! We become the most ...

最新文章

  1. 未来的黑科技计算机作文简写,写一篇英文作文。“未来计算机的发展”
  2. Creational模式之Builder模式
  3. 用数据挖掘来支持音乐创作
  4. html:(17):img标签和表单标签
  5. Github 标星 13K+!这可能是最好的 Java 博客系统
  6. matlab线圈磁场,利用Matlab计算螺线管内磁场分布研究.pdf
  7. verilog赋多位值_Verilog入门学习笔记——第一弹
  8. conda 环境迁移
  9. Mysql字符集转换原理剖析及乱码原因
  10. BootstrapTable的使用教程
  11. html中banner怎么写,banner图欣赏
  12. Terraform 基础 定义阿里云资源 VPC、安全组
  13. 人像修图怎么修脸部瑕疵
  14. 瘦脸针价格 瘦脸针效果 瘦脸针副作用金霞微整形
  15. 对SingleTask和TaskAffinity的理解
  16. 面试督促自己学习进步
  17. B站韩顺平java学习笔记(三)--运算符章节
  18. CreateFileMapping MapViewOfFile UnmapViewOfFile函数用法及示例
  19. 发送linux键盘消息,在C#程序中模拟发送键盘按键消息
  20. LMV321进行运算符电压放大电路设计

热门文章

  1. spreadjs学习笔记
  2. 计算机硬件配件怎么查,如何查看计算机主板型号?主板型号在哪里[方法]
  3. 计算机信息技术结束语,新学期初二年级计算机信息技术课第四节结尾
  4. 【墙角数枝梅,凌寒独自开】代码改变未来
  5. ERROR: sdl2 requested but not found
  6. Cadence导出gds文件
  7. UVA - 10041 Vito's Family (中位数)
  8. Lange定向耦合器的设计与仿真
  9. idea发现git出现cannot run git:cannot identify version of git executable :no response
  10. python2在线编译器_C/C++/Python在线编译器