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

1392 装盒子

基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

 收藏

 关注

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

Input

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

Output

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

Input示例

3
1 1
1 2
2 1

Output示例

4

将能够装进的两个盒子连一条边,然后按照面积大小对盒子排序进行二分图的最大匹配,匹配成功了就将总的面积-装进的盒子的面积。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

int grid[805][805];
int link[805];
int visit[805];
int n, sum2, V1, V2;

struct no {

	int x;
	int y;
}node[205];

bool cmp(const no&node1,const no&node2)
{
	return node1.x*node1.y < node2.x*node2.y;
}

bool dfs(int x)
{
	int i;
	for (i = V2; i>=1; i--)
	{
		if (grid[x][i] && visit[i] == 0)
		{
			visit[i] = 1;
			if (link[i] == -1 || dfs(link[i]))
			{
				link[i] = x;
				return true;
			}
		}
	}
	return false;
}

void Magyarors()
{
	int i;

	memset(link, -1, sizeof(link));//!!这里不能是0  

	for (i = V1; i>=1; i--)
	{
		memset(visit, 0, sizeof(visit));
		if (dfs(i))
		{
			sum2 = sum2 - node[i].x*node[i].y;
		}
	}
	cout << sum2 << endl;

}

int main()
{
	//freopen("i.txt","r",stdin);
	// freopen("o.txt","w",stdout);

	int i,j,sum=0;
	scanf("%d",&n);

	V1 = V2 = n;
	for (i = 1; i <= n; i++)
	{
		scanf("%d%d",&node[i].x,&node[i].y);
		sum2 += node[i].x*node[i].y;
	}
	sort(node + 1, node + n + 1, cmp);
	for (i = 1; i <= n; i++)
	{
		for (j = i+1; j <= n; j++)
		{
			if (node[j].x >= node[i].x&&node[j].y >= node[i].y)
			{
				grid[i][j] = 1;
			}
		}
	}
	Magyarors();
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 06:46:36

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 装盒子

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

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

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

51nod 1163 最高的奖励(贪心+优先队列)

题目链接:51nod 1163 最高的奖励 看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥. 按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的奖励值压入队列,否则将队列中最小的任务的奖励值替换,优先队列按奖励值小的优先. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using name

51Nod 1091 线段的重叠(贪心+区间相关,板子题)

1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的.输出这个最长的距离.如果没有重叠,输出0. Input 第1行:线段的数量N(2 <= N <= 50000). 第2 - N + 1行:每行2个数,线段的起点和终点.(0 

51nod 1091 线段的重叠(贪心)

题目意思: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的.输出这个最长的距离.如果没有重叠,输出0. Input 第1行:线段的数量N(2 <= N <= 50000). 第2 - N + 1行:每行2个数

51nod 1117 聪明的木匠 (贪心)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1117 跟挑战程序书上例题一样,将要切割的n断木板,分别对应二叉树树的叶子节点,则切割的总开销为木板的长度×节点的深度,可以画图理解,那么最短的木板(L1)应当是深度最大的叶子节点之一,次短的板(L2)和它是兄弟节点,由一块长度是(L1+L2) 的木板切割而来,这样可以变成(n-1)块木板,然后递归求解到n==1. 书上贪心部分用的是O(n×n) 的算法 在这里会超时,需

【51Nod】1519 拆方块 贪心+递推

[题目]1519 拆方块 [题意]给定n个正整数,\(A_i\)表示第i堆叠了\(A_i\)个石子.每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除.\(n \leq 10^5\). [算法]贪心+递推 观察每轮操作的变化: \[A_i=min \{ A_i-1,A_{i-1},A_{i+1} \} \] 继续推导,因为每一轮要么-1要么取左右,那么也就是一个数传递到另一个位置要加上它们之间距离的代价(一轮一格,每轮少一个 -1 ),也就是每个数字都可以更新为: \[A_x=\min_

CodeForces 558 C. Amr and Chemistry &amp;&amp; 51NOD 1483 化学变换(暴力 + 贪心)

传送门 Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting experiment. Amr has n different types of chemicals. Each chemical i has an initial volume of ai liters. For this experiment, Amr has to mix all the chemic