思路:和TOYS POJ - 2318 题的思路一样,题意也是差不多,只不过输出为,玩具数量: 分区数,并按照玩具数量的升序输出。代码和之前的差不多,也只是修改了一下输出。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct point
{
int x,y;
point(){}
point(int _x,int _y){x=_x;y=_y;}
};
struct v{
point start;
point end;
v(){}
v(point _start,point _end){
start=_start;end=_end;
}
bool operator <(const v &u)const{
return start.x<u.start.x;
}
}ve[5010];
int cross(v v1,v v2)
{
int result=0;
v1.end.x=v1.end.x-v1.start.x;
v1.end.y=v1.end.y-v1.start.y;
v1.start.x=v1.start.y=0;
v2.end.x=v2.end.x-v2.start.x;
v2.end.y=v2.end.y-v2.start.y;
v2.start.x=v2.start.y=0;
result=v1.end.x*v2.end.y-v2.end.x*v1.end.y;
return result;
}
//向量的叉积的一个重要性质可以通过他的符号判断两向量之间的顺逆时针关系
int n,m,x1,y1,x2,y2,ans[5010],cnt[5010];
int ui,li;
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++)
{
scanf("%d%d",&ui,&li);//变为向量
ve[i]=v(point(ui,y1),point(li,y2));
}
sort(ve,ve+n);
for(int i=0;i<m;i++)
{
point p;
scanf("%d%d",&p.x,&p.y);
int l=0,r=n,t=n;
while(l<=r)//
{
int mid=(l+r)/2;
if(cross(v(p,ve[mid].start),ve[mid])<=0)//在左边
{
t=mid;
r=mid-1;
}
else l=mid+1;
}
ans[t]++;
}
sort(ans,ans+n+1);
memset(cnt,0,sizeof(cnt));
printf("Box\n");
for(int i=0;i<n+1;i++)
if(ans[i]!=0) cnt[ans[i]]++;
for(int i=0;i<n+1;i++)
{
if(cnt[i]!=0)
printf("%d: %d\n",i,cnt[i]);
}
}
return 0;
}

本文详细解析了POJ2398 ToyStorage问题的解决思路及实现代码,该题与TOYS POJ-2318类似,但输出格式不同,需按玩具数量升序排列并输出玩具数量与分区数。
173

被折叠的 条评论
为什么被折叠?



