UVALive 7261 Xiongnu's Land(二分)

本文介绍了一种使用二分查找算法解决特定几何问题的方法。通过对横坐标的二分查找,找到使得左侧矩形区域面积之和尽可能大的最优位置,同时确保该面积至少为总面积的一半。

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

题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5273

思路:二分位置(无需考虑总坐标,仅考虑横坐标即可),使得2*area >= sum,在满足该条件的情况下,尽量右移使得左侧面积尽量大。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debu
using namespace std;
const int maxn=1e4+50;
typedef long long LL;
struct Node
{
    int l,r,h;
};
int t,R,n;
Node a[maxn];
LL cal(int x)
{
    LL sum=0;
    for(int i=0; i<n; i++)
        if(a[i].l<x)
            sum+=(LL)(min(a[i].r,x)-a[i].l)*a[i].h;
    return sum;
}
int main()
{
#ifdef debug
    freopen("in.in","r",stdin);
#endif // debug
    scanf("%d",&t);
    while(t--)
    {
        LL sum=0;
        scanf("%d",&R);
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            int x,y,w,h;
            scanf("%d%d%d%d",&x,&y,&w,&h);
            a[i].l=x,a[i].r=x+w,a[i].h=h;
            sum+=(LL)w*h;
        }
        int l=0,r=R,mid;
        while(l<r)
        {
            mid=(l+r)/2;
            LL area=cal(mid);
            if(2*area<sum) l=mid+1;
            else r=mid;
        }
        LL tmp=cal(r);
        while(cal(r)==tmp&&r<=R) r++;
        printf("%d\n",r-1);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值