zoukankan      html  css  js  c++  java
  • poj2074

    题目大意:从下面的一条直线看最上面的一条直线,中间有很多平行的障碍直线,问下面直线有多长是可以看到最上面的整条直线。。

    思路:对于中间的每条直线求看不到的长度,最后求交集即可

    code:

     1 /*
     2   State:Accepted
     3   Time:2013-03-30 00:51:14
     4 */
     5 #include <iostream>
     6 #include <fstream>
     7 #include <cstring>
     8 #include <cstdio>
     9 #include <cmath>
    10 #include <algorithm>
    11 #include <string>
    12 #include <cstdlib>
    13 #define eps 1e-8
    14 using namespace std;
    15 struct oo{double x1, x2, y;};
    16 
    17 double tx1 , ty ,tx2, dx1, dx2 ,dy;
    18 oo a[1500], b[1500];
    19 int n;
    20 void init(){
    21    scanf("%lf%lf%lf",&dx1, &dx2, &dy);
    22    scanf("%d",&n);
    23    for (int i = 1;  i <= n ; ++i)
    24        scanf("%lf%lf%lf",&a[i].x1, &a[i].x2, &a[i].y);
    25 }
    26 
    27 double work_x(double x1, double y1, double y2){
    28       double x2 = (x1*y2/y1);
    29       return x2;
    30 }
    31 
    32 bool cmp(const oo a, const oo b){
    33     if (a.x1 < b.x1) return true;
    34     if (fabs(a.x1 - b.x1) < eps && a.x2 > b.x2) return true;
    35     return false;
    36  }
    37 
    38 void solve(){
    39    memset(b, 0 ,sizeof(b));
    40    for (int i = 1; i <= n ; ++i ){
    41          if (a[i].y >= ty - eps || a[i].y <= dy - eps) continue;
    42          if ((a[i].y - dy) < eps){
    43               b[i].x1 = a[i].x1;
    44               b[i].x2 = a[i].x2;
    45          } else {
    46                   b[i].x2 = a[i].x2 - work_x(tx1 - a[i].x2, ty - a[i].y , a[i].y - dy);
    47                   b[i].x1 = a[i].x1 -  work_x(tx2 - a[i].x1, ty - a[i].y , a[i].y - dy);
    48                 }
    49          b[i].x2 = max(dx1,b[i].x2);
    50          b[i].x2 = min(dx2,b[i].x2);
    51          b[i].x1 = max(dx1,b[i].x1);
    52          b[i].x1 = min(dx2, b[i].x1);
    53    }
    54    /*for (int  i = 1; i <=  n; ++i)
    55       printf("%.2lf  %.2lf\n", b[i].x1 ,b[i].x2);*/
    56    sort(b+1, b+n+1,  cmp);
    57    double ans =0, LL= 0 , x = dx1;
    58    for (int i = 1; i <= n; ++i){
    59       if (b[i].x2 <= x) continue;
    60       if (b[i].x1 > x){
    61                   LL = b[i].x1 - x;
    62                   ans = max(ans , LL);
    63                   x = b[i].x1;
    64                   }
    65       x = b[i].x2; 
    66    }
    67    ans = max(ans , dx2 - x);
    68    if (fabs(ans) < eps) printf("No View\n");
    69    else printf("%.2f\n",ans);
    70 }
    71 
    72 int main(){
    73     freopen("poj2074.in","r",stdin);
    74     freopen("poj2074.out","w",stdout);
    75     while (~scanf("%lf%lf%lf",&tx1, &tx2, &ty )){
    76         if (fabs(tx1)<eps && fabs(tx2)<eps && fabs(ty)<eps) break;
    77         init();
    78         solve();
    79     }
    80     fclose(stdin); fclose(stdout);
    81 }
  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3015689.html
Copyright © 2011-2022 走看看