题目描述
出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块。
对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。
现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。
输入格式
输入文件第一行包括N和M,表示长N宽M的矩阵。
第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。
第三行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。
输出格式
输出一个整数,表示最小代价。
输入输出样例
输入 #1复制
2 2 3 3
输出 #1复制
9
说明/提示
数据范围:
对于60%的数据,有1 ≤ N ,M≤ 100;
对于100%的数据,有1 ≤ N,M ≤ 2000。
上代码:
#include<cstdio>
#include<algorithm>//用到sort
using namespace std;
const int MAXN=2020;//毕竟刚刚2020~
int a[MAXN],b[MAXN];//横线和竖线的代价
bool cmp(int aa,int bb){return aa>bb;}//从大到小
int main(){
int n,m,s1=1,s2=1;//s1和s2可以是a数组和b数组的指针,也可以是横纵分成的块数
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++) scanf("%d",&a[i]);
for(int i=1;i<m;i++) scanf("%d",&b[i]);
sort(a+1,a+n,cmp);sort(b+1,b+m,cmp);//从大到小排序
long long ans=0;//记录答案,注意long long
for(int i=2;i<n+m;i++){//遍历
if(a[s1]>b[s2]) ans+=s2*a[s1++];//选择大的,这里s2表示块数,s1指针后移一位
else ans+=s1*b[s2++];//同理,和上面相反
}
printf("%lld",ans);
return 0;//华丽结束
}