题解 P1663 【山】
Manjusaka丶梦寒 · · 题解
只能说这是一道数学题,似乎并没有蓝题那么难。
当我们第一眼度完题的时候,很显然我们要找到所有直线相交的最高点。
幸运的是
求直线的解析式应该初中就学了吧,为了避免某些人没学还是稍微提一下吧(大佬可直接跳过)。
对于这直线来说,首先第一==定义函数解析式为
最重要的就是
我们找到
同理对于斜率大于0的直线,求一个最小的右端点
对于斜率等于0的直线只需要判断b是否小于c就好了。
当
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
int n;
double x[5006],y[5006],a[5006],b[5006],ans;
bool check(double x)
{
double L=-2e9,R=2e9;
for(int i=2;i<=n;i++)
{
if(a[i]<0)L=max(L,(x-b[i])/a[i]);
else if(a[i]>0)R=min(R,(x-b[i])/a[i]);
else if(x<b[i])return 0;
}
return L<=R;
}
int main()
{
scanf("%d%lf%lf",&n,&x[1],&y[1]);
for(int i=2;i<=n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
a[i]=(y[i]-y[i-1])/(x[i]-x[i-1]);
b[i]=y[i]-a[i]*x[i];
}
double l=0,r=1000000;
while(l<=r)
{
double mid=(l+r)/2;
if(check(mid))r=mid-0.0001,ans=mid;
else l=mid+0.0001;
}
printf("%.2lf",ans);
}
鄙人不才,有错误请指出,喜欢就点个赞吧。