pku2318 自己想的 超时

来源:互联网 发布:费洛伊德算法 编辑:程序博客网 时间:2024/05/01 07:21
#include<iostream>#include<algorithm>#define MAX 5010using namespace std;typedef struct point{   double x,y;};typedef struct line{   point start,end;};int max(int x,int y)    {        return x>y? x:y;    }    int min(int x,int y)    {        return x<y? x:y;    }   double multi(point p0,point p1,point p2)//计算矢量[p0,p1],  [p0,p2] 的叉积   {       return (p1.x-p0.x)*(p2.y-p0.y)              -(p2.x-p0.x)*(p1.y-p0.y);   }   bool is_cross(point s1,point e1,point s2,point e2)//判断直线相交    {      return max(s1.x,e1.x)>=min(s2.x,e2.x)&&             max(s2.x,e2.x)>=min(s1.x,e1.x)&&             max(s1.y,e1.y)>=min(s2.y,e2.y)&&             max(s2.y,e2.y)>=min(s1.y,e1.y)&&             multi(s2,e1,s1)*multi(e1,e2,s1)>=0&&             multi(s1,e2,s2)*multi(e2,e1,s2)>=0;//加了等号就包括 端点相交     }line b[MAX];point t;int ans[MAX];int main(){    int board,toy,i,j,k;    point Y,X,S;    while(cin>>board)    {    if(board==0) break;          cin>>toy>>Y.x>>Y.y>>X.x>>X.y;         S.x=Y.x; S.y=X.y;         memset(ans,0,sizeof(ans));         for(i=1;i<=board;i++)           {             cin>>b[i].start.x>>b[i].end.x;              b[i].start.y=Y.y;              b[i].end.y  =X.y;           }         for(i=1;i<=toy;i++)         {              cin>>t.x>>t.y;k=0;              for(j=1;j<=board;j++)              {                   if(is_cross(S,t,b[j].start,b[j].end))                       k=j;              }              ans[k]=ans[k]+1;         }         for(i=0;i<=board;i++)            cout<<i<<": "<<ans[i]<<endl;    }    return 0;}
原创粉丝点击