团体程序设计天梯赛 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 }
原文地址:https://www.cnblogs.com/cmyg/p/8719764.html