团体程序设计天梯赛 L3-012. 水果忍者
1 /*对于一条满足条件的直线,向下移,直到触碰一条线段的下端点,仍然经过其它线段,该直线仍然满足条件 2 即以一条线段的下(上)端点作为直线上的一点,求为了经过一条线段的最小、最大斜率值(mink,maxk),直线斜率要求满足 3 max(mink1,mink2,…,minkn) <= min(maxk1,maxk2,…,maxkn) 4 */ 5 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cmath> 9 #include <cstring> 10 #include <stdbool.h> 11 #include <set> 12 #include <vector> 13 #include <map> 14 #include <queue> 15 #include <algorithm> 16 #include <iostream> 17 using namespace std; 18 #define maxn 10005 19 #define inf 1e10 20 21 double x[maxn],yl[maxn],yh[maxn]; 22 23 int main() 24 { 25 long n,i,k,c; 26 double a,b,p,q,t,xx,yy; 27 scanf("%ld",&n); 28 for (i=1;i<=n;i++) 29 scanf("%lf%lf%lf",&x[i],&yh[i],&yl[i]); 30 for (k=1;k<=n;k++) 31 { 32 p=inf; 33 q=-inf; 34 for (i=1;i<=n;i++) 35 if (i!=k) 36 { 37 a=(yh[i]-yl[k])/(x[i]-x[k]); 38 b=(yl[i]-yl[k])/(x[i]-x[k]); 39 if (a<b) 40 { 41 t=a; 42 a=b; 43 b=t; 44 c=0; 45 } 46 else 47 c=1; 48 if (p<b || q>a) 49 break; 50 // p=min(p,a); 51 if (a<p) 52 { 53 p=a; 54 if (c==1) 55 { 56 yy=yh[i]; 57 xx=x[i]; 58 } 59 else 60 { 61 yy=yl[i]; 62 xx=x[i]; 63 } 64 } 65 q=max(q,b); 66 } 67 if (i==n+1) 68 { 69 printf("%.0lf %.0lf %.0lf %.0lf",x[k],yl[k],xx,yy); 70 return 0; 71 } 72 } 73 return 0; 74 }