51nod 1392 装盒子

有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放。注意一个盒子只可以套入长和宽分别不小于它的盒子,并且一个盒子里最多只能直接装入另外一个盒子 (但是可以不断嵌套),例如1 * 1 可以套入2 * 1,而2 * 1再套入2 * 2。套入之后盒子占地面积是最外面盒子的占地面积。给定N个盒子大小,求最终最小的总占地面积。

Input

第一行一个数N表示盒子的个数。
接下来N行,每行两个正整数,表示每个盒子的长度和宽度。
所有整数都是正的(N,以及盒子的长宽),且不超过200。

Output

一行一个整数表示最终最小的占地面积。

对于相同大小的盒子可以相互嵌套而只保留一个,考虑最大费用最大流,每个盒子i拆成a[i],b[i]两点,若x可放入y,则连边a[x]->b[y],流量1,费用为x的面积,代表x放入y对答案的影响,源点到a[i]连边,流量1,费用0,使每个盒子最多只能放进一个盒子,a[i],b[i]到汇点连边,流量1,费用0,使每个盒子最多只能被放入一个盒子

#include<cstdio>
#include<queue>
#include<algorithm>
int n;
struct pos{
    int a,b;
}ps[207];
bool operator<(pos a,pos b){
    return a.a!=b.a?a.a<b.a:a.b<b.b;
}
bool operator==(pos a,pos b){
    return a.a==b.a&&a.b==b.b;
}
const int N=400007,inf=0x3f3f3f3f;
int es[N],enx[N],ev[N],ec[N],e0[N],ep=2,S,T,ans=0,l[N],in[N],pv[N],pe[N];
std::queue<int>q;
void adde(int a,int b,int f,int c){
    es[ep]=b;enx[ep]=e0[a];ev[ep]=f;ec[ep]=c;e0[a]=ep++;
    es[ep]=a;enx[ep]=e0[b];ev[ep]=0;ec[ep]=-c;e0[b]=ep++;
}
bool sp(){
    for(int i=1;i<=T;++i)l[i]=-inf;
    l[S]=0;
    q.push(S);
    while(!q.empty()){
        int w=q.front();q.pop();
        in[w]=0;
        for(int i=e0[w];i;i=enx[i])if(ev[i]){
            int u=es[i];
            if(l[w]+ec[i]>l[u]){
                l[u]=l[w]+ec[i];
                pv[u]=w;
                pe[u]=i;
                if(!in[u])in[u]=1,q.push(u);
            }
        }
    }
    return l[T]>0;
}
void mcs(){
    for(int w=T;w!=S;w=pv[w]){
        int e=pe[w];
        --ev[e];
        ++ev[e^1];
    }
    ans-=l[T];
}
int cs[2000];
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;++i)scanf("%d%d",&ps[i].a,&ps[i].b);
    std::sort(ps,ps+n);
    n=std::unique(ps,ps+n)-ps;
    S=n*2+1;T=S+1;
    for(int i=0;i<n;++i){
        ans+=ps[i].a*ps[i].b;
        for(int j=0;j<n;j++)if(i!=j&&ps[i].a<=ps[j].a&&ps[i].b<=ps[j].b){
            adde(i+1,n+j+1,1,ps[i].a*ps[i].b);
        }
        adde(S,i+1,1,0);
        adde(n+i+1,T,1,0);
        adde(i+1,T,1,0);
    }
    while(sp())mcs();
    printf("%d",ans);
    return 0;
}
时间: 2025-01-18 08:20:32

51nod 1392 装盒子的相关文章

51nod 1392 装盒子(费用流)

如果权值为\(1\)就是最长反链. 然而并不是.考虑用费用流. 把每一个盒子\(i\)拆成i和\(i+n\). 设源点为\(S\),汇点为\(T\). \(S\)向每一个i连容量为\(1\),费用为\(L[i]*W[i]\)的边 每一个\(i\)向\(T\)连容量为\(1\),费用为\(0\)的边. 每一个\(i\)向\(i+n\)连容量为\(1\),费用为\(0\)的边. 如果j能被i装下,就从i向j连一条容量为\(1\),费用为\(-L[j]*W[j]\)的边. 跑最小费用最大流即可. (P

51nod 1392:装盒子 匈牙利+贪心

1392 装盒子 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子只可以套入长和宽分别不小于它的盒子,并且一个盒子里最多只能直接装入另外一个盒子 (但是可以不断嵌套),例如1 * 1 可以套入2 * 1,而2 * 1再套入2 * 2.套入之后盒子占地面积是最外面盒子的占地面积.给定N个盒子大小,求最终最小的总占地面积. Input 第一行一个数N表示盒子的个数.

51nod 算法马拉松4 D装盒子(网络流 / 二分图最优匹配)

装盒子 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子只可以套入长和宽分别不小于它的盒子,并且一个盒子里最多只能直接装入另外一个盒子 (但是可以不断嵌套),例如1 * 1 可以套入2 * 1,而2 * 1再套入2 * 2.套入之后盒子占地面积是最外面盒子的占地面积.给定N个盒子大小,求最终最小的总占地面积. Input 第一行一个数N表示盒子的个数. 接下来N行,每行两个正整数,表示每个盒子的长

51nod 算法马拉松4

http://www.51nod.com/contest/problemList.html#!contestId=9 D 装盒子 拓扑排序?

【设计模式】HeadFirst设计模式(四):工厂模式

设计模式要求我们不应该针对实现编程,是为了降低耦合度,提高可维护性.当程序中出现"new"的时候,就证明程序在实例化一个具体类,所以用的是实现,而不是接口.如果代码绑着具体的类会导致代码更加脆弱,缺乏弹性.比如,需要创建一"个鸡蛋饼"这个对象,首先需要创建一个饼,然后创建一个鸡蛋,再然后把鸡蛋摊在饼上边,然后给饼翻翻,几分钟后就出炉了....(有点饿).在这种情况下,新对象的建立是一个过程,如果我们需要在这个饼上边抹点辣椒酱,那肯定需要对类进行修改,违反了"

css+div

什么是css什么是div? div是盒子的意思就是存放数据的盒子. css就是怎么来存放盒子存放盒子里面的数据. 那么css+div是用来做什么的? 是用来做网页页面的.一个网页的页面可以看做是很多个盒子组装起来的.盒子装盒子啊,盒子重盒子啊,这些.然后我们在盒子里面放上图片,文字等.就成为我们的网页了.

视频学习_css基础学习

块状元素 block element 容器元素  设置高宽 width height  可以容纳 文本 内脸 和其他块状 霸道  独占一行 特例:form  只容纳 块状元素 常见元素 http://www.w3cfuns.com/portal.php?mod=topic&quickforward=1&topicid=21 内联元素  inline element 非块状元素 不独占一行 只容纳文本  和内联 常见的 有a 相当与气球 内容越多越大 内联元素不能包含块状元素  气球不能装盒

用mediaplay实现抓图

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

当父盒子的宽装不下li标签的时候

当父盒子的宽装不下需要的li标签的时候(li标签用foat时),可以把ul标签作为一个盒子,赋予它的宽度大于需要的一排的盒子宽度,小于(一排+1)个盒子宽度. 原效果图: 先效果图: 原代码: 现代码: 因为祖辈元素设置了宽高,并且不能超过他显示,影响美观.所以我们给祖辈元素设置一个overflow:hidden,隐藏多余部分.