spoj 274

本文介绍了一种离散化与枚举横坐标的算法解决特定问题的方法,通过输入数据和参数,算法计算并输出最优解。此算法在处理大量数据时表现出高效性,适用于优化决策过程。

离散化   枚举行  扫描横坐标

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 0x7fffffff
using namespace std;

struct cc
{
    int x,y,val;
};
cc pp[1010];
int k,line[1010],x[1010],cur;
int _max,_min;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d%d",&n,&k);
        _max = -1;
        _min = inf;
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d%d",&pp[i].x,&pp[i].y,&pp[i].val);
            line[i] = pp[i].y;
            _max = max(pp[i].x, _max);
            _min = min(pp[i].x, _min);
        }
        sort(line, line+n);
        int q = unique(line, line+n) - line;
//        if(q == 1)
//        {
//            puts("0");
//            continue;
//        }
        int ans = inf;
        for(int i = 0; i < q; i++)
        {
            for(int j = i; j < q; j++)
            {
                memset(x, 0, sizeof(x));
                for(int v = 0; v < n; v++)
                {
                    if(pp[v].y >= line[i] && pp[v].y <= line[j])
                        x[pp[v].x] += pp[v].val;
                }
                int l,r;
                l = r = _min;
                cur = x[_min];
                while(r <= _max)
                {
                    if(cur >= k)
                    {
                        ans = min(ans, (line[j]-line[i])*(r-l));
                        cur -= x[l++];
                    }
                    else
                    {
                        cur += x[++r];
                    }
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值