CF98C Help Greg the Dwarf 题解
1.AGC0552.CF1838A-Blackboard-List3.P7959 [COCI2014-2015#6] WTF 题解4.CF437E The Child and Polygon5.无所畏惧的求和题解6.[ROI 2018] Innophone 题解7.[SHOI2011]双倍回文 题解8.2023-02-02 比赛试题及题解9.AGC04310.AGC03311.「TAOI-2」Ciallo~(∠・ω< )⌒★ 题解12.CF题解合集
13.CF98C Help Greg the Dwarf 题解
14.恋爱入门教学题解15.[CSP-S2019] 树的重心 题解16.CSP-S2023 题解17.CSP-S2019 题解18.CSP-S2019 江西 题解19.YNOI 做题记20.NOIP2022 题解21.CF1900D - Small GCD 题解22.杂题记录CF98C Help Greg the Dwarf 题解
为什么不三分?
首先我们考虑如何求出答案。
如图,考虑设夹角为 ,那么可以得到表达式:
整理可得:
于是可以考虑观察这个函数的单调性:
明显这是个单峰函数。
考虑合法的大小即是此函数的最小值。
特判掉 或者 的情况:
所以考虑三分答案求最小即可。
不过需要判断无解的情况!
注意一下 CF 上似乎不能使用
long double
……亦或是我写法的问题 QwQ
#include <stdio.h>
#include <math.h>
#define ldb double
int a, b, l;
ldb calc(ldb theta) {
ldb c = cos(theta), s = sin(theta);
return a * s - l * c * s + b * c;
}
int main() {
scanf("%d %d %d", &a, &b, &l);
if (l <= b) {
printf("%.10lf\n", (ldb)(a < l ? a : l));
return 0;
}
if (l <= a) {
printf("%.10lf\n", (ldb)(b < l ? b : l));
return 0;
}
ldb L = 0, R = acos(-1) / 2;
const ldb eps = 1e-10;
while (L + eps < R) {
ldb ml = (L + L + R) / 3, mr = (L + R + R) / 3;
ldb vl = calc(ml), vr = calc(mr);
if (vl < vr) R = mr;
else L = ml;
}
ldb ans = calc(L);
if (l < ans) ans = l;
if (ans < eps) puts("My poor head =(");
else printf("%.10lf\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App