
时间: 1000ms / 空间: 131072KiB / Java类名: Main
背景
YHOI Train#4 Problem 1
描述
出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块。
对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。
现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。
对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。
现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。
输入格式
输入文件第一行包括N和M,表示长N宽M的矩阵。
第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。
第二行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。
第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。
第二行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。
输出格式
输出一个整数,表示最小代价。
测试样例1
输入
2 2
3
3
输出
9
备注
对于60%的数据,有1 ≤ N ,M≤ 100;
对于100%的数据,有1 ≤ N,M ≤ 2000。
对于100%的数据,有1 ≤ N,M ≤ 2000。
题目大意:把一个n*m的矩形切成1*1的小正方形,不能叠着切。
每切一刀都有代价,求最少代价。
题解:贪心。
先把代价大的那一刀给切了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define maxn 2017
#define inf 100000000
using namespace std; int l1,l2,n,m,vc,vr,row[maxn],col[maxn];
LL ans; int main(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)scanf("%d",&row[i]);
for(int i=;i<m;i++)scanf("%d",&col[i]);
sort(row+,row+n);sort(col+,col+m);
l1=n-;l2=m-;vc=;vr=;
while(){
if(!l1&&!l2)break;
if(l1==)row[l1]=-inf;
if(l2==)col[l2]=-inf;
if(row[l1]>=col[l2]){
vr++;
ans+=vc*row[l1--];
}else vc++,ans+=vr*col[l2--];
}
printf("%lld\n",ans);
return ;
}