#P51782. 「CodePlus 2018 4 月赛」白金元首与七彩魔法

「CodePlus 2018 4 月赛」白金元首与七彩魔法

题目描述

小朋友 你们好吗 还能记得 我是谁吗 我就是魔法元首まどか!

「和我签订契约,成为魔法元首吧!」

于是这天元首不明所以地被地外生物 Kyubey 忽悠去成为了魔法元首。不过在开始练习魔法之前,元首需要为自己的魔法选择一个代表色。

下图是一个明度最大(即,HSV 色彩空间中 V=100%V = 100\%)的单位圆色盘。色盘上任意一点的坐标为一个非负实数对 (α°,r%)(\alpha°, r\%)0α<3600 \leq \alpha < 3600r1000 \leq r \leq 100),表示色相α°\alpha°饱和度r%r\% 的颜色。另一种理解是,α°\alpha° 表示从联结圆心和纯红色点的射线顺时针到达该点所经过的角度,r100\frac {r} {100} 是该点到单位圆圆心的距离。

palette_1.png

具体而言,从这个坐标 (α°,r%)(\alpha°, r\%) 到红绿蓝颜色值 (R,G,B)(R, G, B) 的转换如下:

h=α60f=α60hp=1(r%)q=1f×(r%)t=1(1f)×(r%)\begin{align} h &= \left\lfloor \frac{\alpha}{60} \right\rfloor \\ f &= \frac{\alpha}{60} - h \\ p &= 1 - (r\%) \\ q &= 1 - f \times (r\%) \\ t &= 1 - (1 - f) \times (r\%) \end{align}

(R,G,B)={(1,t,p), if h=0(q,1,p), if h=1(p,1,t), if h=2(p,q,1), if h=3(t,p,1), if h=4(1,p,q), if h=5(R, G, B) = \begin{cases} (1, t, p), & \ \text{if} \ h = 0 \\ (q, 1, p), & \ \text{if} \ h = 1 \\ (p, 1, t), & \ \text{if} \ h = 2 \\ (p, q, 1), & \ \text{if} \ h = 3 \\ (t, p, 1), & \ \text{if} \ h = 4 \\ (1, p, q), & \ \text{if} \ h = 5 \end{cases}

请参照样例确认你对公式的理解和实现。

按照 Kyubey 的判断,元首可以选择色盘所在的平面上一条给定直线段 (α1°,r1%)(\alpha_1°, r_1 \%)(α2°,r2%)(\alpha_2°, r_2 \%) 上的任意颜色。元首可不需要犹豫,作为一名 bling bling 的帝国领导者,当然要选择最亮的颜色啦!

一个颜色 (R,G,B)(R, G, B)亮度定义为 L=0.30R+0.59G+0.11BL = 0.30R + 0.59G + 0.11B。下图给出了彩色色盘和表示亮度的灰度色盘的左右对比。

palette_2.png

你需要编写程序帮助元首计算给定直线段上所有颜色的最大亮度。

输入格式

从标准输入读入数据。

输入的第一行包含一个正整数 TT —— 数据的组数。接下来包含 TT 组数据,格式如下,数据间没有空行。

  • 11 行:四个空格分隔的整数 α1\alpha_1r1r_1α2\alpha_2r2r_2

输出格式

输出到标准输出。

对于每组数据输出一行,包含一个 [0,1][0, 1] 范围内的十进制小数 —— 直线段 (α1°,r1%)(\alpha_1°, r_1 \%)(α2°,r2%)(\alpha_2°, r_2 \%) 上所有颜色的最大亮度,四舍五入保留恰好四位小数。数据保证若参考答案为 AA,则 [A105,A+105][A - 10^{-5}, A + 10^{-5}] 范围内任意实数四舍五入到第四位小数后均相等。

样例

6
30 30 30 30
120 60 120 60
270 100 270 100
30 30 120 60
120 60 270 100
270 100 30 30

0.8785
0.7540
0.2600
0.9704
0.9408
0.8785

(30°,30%)(30°, 30\%) 的红绿蓝颜色值为 (1.00,0.85,0.70)(1.00, 0.85, 0.70),亮度为 0.30×1.00+0.59×0.85+0.11×0.70=0.87850.30 \times 1.00 + 0.59 \times 0.85 + 0.11 \times 0.70 = 0.8785

(120°,60%)(120°, 60\%) 的红绿蓝颜色值为 (0.40,1.00,0.40)(0.40, 1.00, 0.40),亮度为 0.30×0.40+0.59×1.00+0.11×0.40=0.75400.30 \times 0.40 + 0.59 \times 1.00 + 0.11 \times 0.40 = 0.7540

(270°,100%)(270°, 100\%) 的红绿蓝颜色值为 (0.50,0.00,1.00)(0.50, 0.00, 1.00),亮度为 0.30×0.50+0.59×0.00+0.11×1.00=0.26000.30 \times 0.50 + 0.59 \times 0.00 + 0.11 \times 1.00 = 0.2600

数据范围与提示

对于所有数据,有 T100T \leq 1000α1,α2<3600 \leq \alpha_1, \alpha_2 < 3600r1,r21000 \leq r_1, r_2 \leq 100

测试点编号 附加限制
1 α1=α2\alpha_1 = \alpha_2r1=r2r_1 = r_2
2
3 α1=α2\alpha_1 = \alpha_2
4
5 α1,α2<60\alpha_1, \alpha_2 < 60
6
7 α1α2<60\lvert \alpha_1 - \alpha_2 \rvert < 60r1=r2r_1 = r_2
8
9
10

Ich glaube, ich habe mich klar genug ausgedrückt!

题面与史实无关。


来自 CodePlus 第 4 次月赛,清华大学计算机科学与技术系学生算法与竞赛协会 荣誉出品。
Credit:idea 与命题/吕时清 验题/朱玮昊
Git Repo:https://git.thusaac.org/publish/CodePlus4
感谢腾讯公司对此次比赛的支持。