Pick-up sticks

#include <iostream>
#include <cmath>
#include <list>
#define eps 1e-8

using namespace std;


struct point 
{
 double x;
 double y;
};

struct line
{
 point a;
 point b;
}arry[100005];

double xmult(point p1,point p2,point p0)
{
 return (p1.x-p0.x)*(p2.y - p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

int opposite_side(point p1,point p2,line l)
{
 return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)<-eps;
}

int intersect_ex(line u,line v)
{
 return opposite_side(u.a,u.b,v)&&opposite_side(v.a,v.b,u);
}

//bool intersect_ex(line u,line v)
//{
// if(((max(u.a.x,u.b.x)>=min(v.a.x,v.b.x))&&(max(v.a.x,v.b.x)>=min(u.a.x,u.b.x))
//  &&(max(u.a.y,u.b.y)>=min(v.a.y,v.b.y))&&(max(v.a.y,v.b.y)>=min

(u.a.y,u.b.y))&&
//  (xmult(v.a,u.b,u.a)*xmult(u.b,v.b,u.a))>0&&(xmult(u.a,v.b,v.a)*xmult

(v.b,u.b,v.a))>0))
//  return true;
// else 
//  return false;
//}

void output(list<int>n)
{
//* int temp=0;
// for(int i=n-1;i>=0;--i)
// {
//  if(arry[i].flag==0)
//  {
//   temp=i;
//   break;
//  }
// }
// printf("Top sticks:");
// for(int i=0;i<temp;++i)
// {
//  if(arry[i].flag==0)
//  {
//   printf(" %d,",i+1);
//  }
// }
 //printf(" %d.\n",temp+1)*/
 printf("Top sticks:");
 list<int>::iterator it;
 for(it=n.begin();it!=n.end();++it)
 {
  if(it!=--n.end())
      printf(" %d,",*it+1);
  else
   printf(" %d.\n",*it+1);
 }
}

void input()
{
 int n;
 while(scanf("%d",&n))
 {
  if(n==0)break;
  else 
  {
   list<int>list1; 
   list<int>::iterator it;
   int temp;
   for(int i=0;i<n;++i)
   {
    list1.push_back(i);
    scanf("%lf %lf %lf %lf",&arry[i].a.x,&arry[i].a.y,&arry

[i].b.x,&arry[i].b.y);
    temp=0;
    //for(int j=0;j<i;++j)
    //{
    // if(arry[j].flag==0)
    // {
    //  temp=intersect_ex(arry[j],arry[i]);
    //  if(temp==1)
    //  {
    //   arry[j].flag=1;
    //  }
    // }
    //}
    for(it = list1.begin();it!=list1.end();)
    { 
     temp=intersect_ex(arry[*it],arry[i]);
     if(temp)
     {
      //cout<<"temp=="<<temp<<" "<<*it<<endl;
      it=list1.erase(it);
     }
     else 
      it++;
    }
    //for(it=list1.begin();it!=list1.end();++it)
    // cout<<*it+1<<" ";
    //cout<<endl;
   }
   output(list1);
  }
 }
}

int main()
{
 input();
 return 0;
}

题目大意:有很多木棍洒在地上,这样的话就有的木棍在上面,有的在下面了.木棍的厚度不计,就表示只

要木棍相交就算.问最后有多少跟木棍在最上面.
算法分析:计算几何,首先肯定用结构体了.双层结构体.判断木棍是否相交,用跨立和摸版的速度都一样

的.不过开始我暴力,过不了,数据量太大.后来用了STL里的list,不过在删除的地方遇到了一些困难搞了

好久才弄明白.remove()不行,erase()才成功,删除之后一定要注意下标的位置,在这个地方我WA了两次.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值