POJ 2318 TOYS

来源:互联网 发布:js执行按钮点击事件 编辑:程序博客网 时间:2024/04/30 11:54

题意就是把一个矩形分成N+1个块,往里面扔M个玩具,问每个块里有多少玩具。

思路:求一下每条线的K和B。K不存在特殊标记一下,在K>0的情况下k*xx+b<yy表示在直线的左侧,同理在k<0的情况下k*xx+b>yy在直线的左侧。

#include"iostream"#include"cmath"#include"cstring"#include"cstdlib"using namespace std;#define M 5555int main(){int n,m;double x1,x2,y1,y2;while(scanf("%d",&n),n!=0){scanf("%d",&m);scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);int i,j;double a[M],b[M];double k[M],bb[M];int c[M],f;int ans[M];memset(ans,0,sizeof(ans));memset(c,0,sizeof(c));memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(k,0,sizeof(k));memset(bb,0,sizeof(bb));for(i=0;i<n;i++) scanf("%lf %lf",&a[i],&b[i]);for(i=0;i<n;i++){if(fabs(a[i]-b[i])>1e-8){k[i]=(y1-y2)/(a[i]-b[i]);bb[i]=y2-k[i]*b[i];}else{c[i]=-1;bb[i]=a[i];}}for(i=0;i<m;i++){double xx,yy;scanf("%lf%lf",&xx,&yy);f=0;for(j=0;j<n;j++){if((c[j]==-1&&xx<bb[j])||(k[j]>0&&xx*k[j]+bb[j]<yy)||(k[j]<0&&xx*k[j]+bb[j]>yy)){ans[j]++;f=1;break;}}if(f==0)ans[(int)n]++;}for(i=0;i<=n;i++)printf("%d: %d\n",i,ans[i]);printf("\n");}return 0;}


0 0