POJ 2398 Toy Storage

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

POJ 2398 Toy Storage

思路:和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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值