您的位置:首页 > 其它

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

2016-08-12 21:09 501 查看


1354. 【2011.12.24普及模拟】土地购买(acquire.pas/cpp) 

(File IO): input:acquire.in output:acquire.out

时间限制: 1000 ms  空间限制: 262144
KB  具体限制  
Goto ProblemSet


题目描述

    农夫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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jzoj 1354