zoukankan      html  css  js  c++  java
  • BZOJ 1597: [Usaco2008 Mar]土地购买

    Time Limit: 10 Sec  Memory Limit: 162 MB

    Description

    农 夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.

    Input

    * 第1行: 一个数: N

    * 第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽

    Output

    * 第一行: 最小的可行费用.

    Sample Input

    4
    100 1
    15 15
    20 5
    1 100

    输入解释:

    共有4块土地.

    Sample Output

    500

    HINT

    FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组的价格分别为100,100,300, 总共500.

    Source

    首先有一些土地如果有长和宽同时比它的话那么它就可以被忽略,所以我们可以直接将原本的数组以a为第一关键字,以b为第二关键字降序排序。

    之后用一个单调栈放入。原因是已经在栈中的元素的a值必然比后放入的大或相等,所以如果b值还比栈中元素小那么它应该被忽略。

    所以O(n^2)的dp方程是:f[i]=min(f[j]+x[j+1].a*x[i].b);(0<=j<i)

    设j<k,j比k优则(f[j]-f[k])/(x[k+1].a-x[j+1].a)>x[i].b

    维护下凸壳即可

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=50005;
    typedef long long ll;
    struct X
    {
        int a,b;
    }x[N];
    ll f[N];
    int q[N];
    bool cmp(const X &t1,const X &t2)
    {
        return t1.a==t2.a?t1.b>t2.b:t1.a>t2.a;
    }
    double xl(int a,int b)
    {
        return (double)(f[a]-f[b])/(x[b+1].a-x[a+1].a);
    }
    int main()
    {
        int n,s=0,t=0,w=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d%d",&x[i].a,&x[i].b);
        sort(x+1,x+n+1,cmp);
        for(int i=1;i<=n;i++)
            if(x[i].b>x[s].b) x[++s]=x[i];
        for(int i=1;i<=s;i++)
        {
            for(;t<w&&xl(q[t],q[t+1])<=x[i].b;t++);
            f[i]=f[q[t]]+(ll)x[i].b*x[q[t]+1].a;
            for(;t<w&&xl(q[w],q[w-1])>=xl(q[w],i);w--);
            q[++w]=i;
        }
        printf("%lld",f[s]);
        return 0;
    }
  • 相关阅读:
    希腊字母写法
    The ASP.NET MVC request processing line
    lambda aggregation
    UVA 10763 Foreign Exchange
    UVA 10624 Super Number
    UVA 10041 Vito's Family
    UVA 10340 All in All
    UVA 10026 Shoemaker's Problem
    HDU 3683 Gomoku
    UVA 11210 Chinese Mahjong
  • 原文地址:https://www.cnblogs.com/bzmd/p/6274977.html
Copyright © 2011-2022 走看看