1. 程式人生 > >團體程序設計天梯賽 L3-012. 水果忍者

團體程序設計天梯賽 L3-012. 水果忍者

ace style pos pac print col clas map else

 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 }

團體程序設計天梯賽 L3-012. 水果忍者