jzoj 1354. 【2011.12.24普及模拟】土地购买

本文介绍了一个关于土地购买的问题,农夫John希望通过合理分组购买N块土地以最小化总花费。文章提供了完整的算法思路和Pascal语言实现代码,通过将土地按长宽组合优化,达到最小费用。
题目描述
    农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 5,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000).

每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25.

FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.
输入
第1行: 一个数: N

第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽
输出
第一行: 最小的可行费用.
样例输入
4
100 1
15 15
20 5
1 100
样例输出
500
数据范围限制
提示
输出说明

    输入解释:共有4块土地.

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


贪心

代码如下,自行理解吧。。

var
 n,i,j:longint; sum:int64;
 x,y:array[1..5000]of int64;

function max(a,b:int64):int64;
begin
 if a>b then exit(a) else exit(b);
end;

begin
 assign(input,'acquire.in');reset(input);
 assign(output,'acquire.out');rewrite(output);
 readln(n);
 for i:=1 to n do
  readln(x[i],y[i]);
 for i:=1 to n do
  for j:=1 to n do
  if i<>j then
  if (x[i]*y[i]+x[j]*y[j])>(max(x[i],x[j])*max(y[i],y[j])) then
   begin
    x[i]:=max(x[i],x[j]);
    y[i]:=max(y[i],y[j]);
    x[j]:=0; y[j]:=0;
   end;
 for i:=1 to n do
  sum:=sum+x[i]*y[i];
 write(sum);
 close(input); close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值