poj 2318 TOYS 计算几何(入门)+二分

本文介绍了一个使用C++实现的几何计算程序,通过结构体和数组管理几何板的上下边界,采用二分查找算法进行高效计算。涉及C++标准库的多个组件,如输入输出、算法、容器等,展示了数据结构和算法在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础入门题,做法单一。

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <deque>
using namespace std;

struct node
{
    long long u,l;

}geban[6000];
int ans[6000];
long long yy1,yy2;

bool cmp(const struct node &a,const struct node &b)
{
    return a.u<b.u;
}

bool f(long long x,long long y,long long u,long long l)
{//0 left 1 right
    if(u==l)
    {
        if(x<u) return 0;
        else return 1;
    }

    double k,b,newx;
    k=double(yy1-yy2)/double(u-l);
    b=double(yy1)-k*double(u);

    newx=(y-b)/k;

    if(newx<double(x)) return 1;
    else return 0;
}

int  main()
{
    long long  i,j,k,l,t,m,n,a,b,h,x1,x2,r,mid;

    while(1)
    {
        scanf("%lld",&n);
        if(n==0) return 0;

        scanf("%lld",&m);
        scanf("%lld",&x1);scanf("%lld",&yy1);
        scanf("%lld",&x2);scanf("%lld",&yy2);

        for(i=0;i<n;i++)
        {
            scanf("%lld",&geban[i].u);scanf("%lld",&geban[i].l);
            ans[i]=0;
        }
        ans[n]=0;

        sort(geban,geban+n,cmp);

        for(i=0;i<m;i++)
        {
            scanf("%lld",&j);scanf("%lld",&k);

            if(f(j,k,geban[0].u,geban[0].l)==0)
            ans[0]++;
            else if(f(j,k,geban[n-1].u,geban[n-1].l)==1)
            ans[n]++;
            else
            {
                l=0;r=n-1;

                while(l<r-1)
                {
                    mid=(l+r)/2;

                    if(f(j,k,geban[mid].u,geban[mid].l)==0)
                    r=mid;
                    else l=mid;
                }
                ans[l+1]++;
            }
        }

        for(int i=0;i<=n;i++)
        {
            printf("%d: %d\n",i,ans[i]);
        }

        printf("\n");
    }



    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值