zoukankan      html  css  js  c++  java
  • POJ2653 Pickup sticks

      原题链接:http://poj.org/problem?id=2653

      线段相交。

      从后往前筛TLE,从前往后却AC了,数据坑爹。

    View Code
     1 #include <cstdio>
     2 #define maxn 100005
     3 const double eps = 1e-8;
     4 struct segment
     5 {
     6     double x1, y1, x2, y2;
     7 }seg[maxn];
     8 
     9 double min(double a, double b)
    10 {
    11     return a < b ? a : b;
    12 }
    13 
    14 double max(double a, double b)
    15 {
    16     return a > b ? a : b;
    17 }
    18 
    19 bool segcross(segment seg1, segment seg2)
    20 {
    21     if(min(seg1.x1, seg1.x2) > max(seg2.x1, seg2.x2) ||
    22        min(seg1.y1, seg1.y2) > max(seg2.y1, seg2.y2) ||
    23        min(seg2.x1, seg2.x2) > max(seg1.x1, seg2.x2) ||
    24        min(seg2.y1, seg2.y2) > max(seg1.y1, seg2.y2)) return 0;
    25 
    26     double h, i, j, k;
    27     h = (seg1.x2 - seg1.x1) * (seg2.y1 - seg1.y1) - (seg1.y2 - seg1.y1) * (seg2.x1 - seg1.x1);
    28     i = (seg1.x2 - seg1.x1) * (seg2.y2 - seg1.y1) - (seg1.y2 - seg1.y1) * (seg2.x2 - seg1.x1);
    29     j = (seg2.x2 - seg2.x1) * (seg1.y1 - seg2.y1) - (seg2.y2 - seg2.y1) * (seg1.x1 - seg2.x1);
    30     k = (seg2.x2 - seg2.x1) * (seg1.y2 - seg2.y1) - (seg2.y2 - seg2.y1) * (seg1.x2 - seg2.x1);
    31     return h * i < eps && j * k < eps;
    32 }
    33 
    34 int main()
    35 {
    36     int n, i, j, stick[1005], cnt;
    37     bool flag;
    38     while(scanf("%d", &n), n)
    39     {
    40         for(i = 0; i < n; i ++)
    41             scanf("%lf%lf%lf%lf", &seg[i].x1, &seg[i].y1, &seg[i].x2, &seg[i].y2);
    42 
    43         cnt = 0;
    44 
    45         for(i = 0; i < n; i ++)
    46         {
    47             flag = false;
    48             for(j = i + 1; j < n; j ++)
    49             {
    50                 if(segcross(seg[i], seg[j]))
    51                 {
    52                     flag = true;
    53                     break;
    54                 }
    55             }
    56             if(!flag)
    57                 stick[++ cnt] =  i + 1;
    58         }
    59         printf("Top sticks:");
    60         for(i = 1; i < cnt; i ++)
    61         {
    62             printf(" %d,", stick[i]);
    63         }
    64         printf(" %d.\n", stick[i]);
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    BZOJ 4408: [Fjoi 2016]神秘数
    51Nod 1317 相似字符串对
    51Nod 1561 另一种括号序列
    BZOJ 4556: [Tjoi2016&Heoi2016]字符串
    51Nod 1048 整数分解为2的幂 V2
    BZOJ 4698: Sdoi2008 Sandy的卡片
    BZOJ 3571: [Hnoi2014]画框
    BZOJ 2752: [HAOI2012]高速公路(road)
    BZOJ 1095: [ZJOI2007]Hide 捉迷藏
    BZOJ 4537: [Hnoi2016]最小公倍数
  • 原文地址:https://www.cnblogs.com/huangfeihome/p/2732470.html
Copyright © 2011-2022 走看看