团体程序设计天梯赛 L3-012. 水果忍者

时间:2022-04-10 10:36:44
 /*对于一条满足条件的直线,向下移,直到触碰一条线段的下端点,仍然经过其它线段,该直线仍然满足条件
即以一条线段的下(上)端点作为直线上的一点,求为了经过一条线段的最小、最大斜率值(mink,maxk),直线斜率要求满足
max(mink1,mink2,…,minkn) <= min(maxk1,maxk2,…,maxkn)
*/ #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <stdbool.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 10005
#define inf 1e10 double x[maxn],yl[maxn],yh[maxn]; int main()
{
long n,i,k,c;
double a,b,p,q,t,xx,yy;
scanf("%ld",&n);
for (i=;i<=n;i++)
scanf("%lf%lf%lf",&x[i],&yh[i],&yl[i]);
for (k=;k<=n;k++)
{
p=inf;
q=-inf;
for (i=;i<=n;i++)
if (i!=k)
{
a=(yh[i]-yl[k])/(x[i]-x[k]);
b=(yl[i]-yl[k])/(x[i]-x[k]);
if (a<b)
{
t=a;
a=b;
b=t;
c=;
}
else
c=;
if (p<b || q>a)
break;
// p=min(p,a);
if (a<p)
{
p=a;
if (c==)
{
yy=yh[i];
xx=x[i];
}
else
{
yy=yl[i];
xx=x[i];
}
}
q=max(q,b);
}
if (i==n+)
{
printf("%.0lf %.0lf %.0lf %.0lf",x[k],yl[k],xx,yy);
return ;
}
}
return ;
}