在某年某月某日,小D莫名其妙的得到一块超级大的魔法巧克力,于是他决定将这块巧克力切成若干块送给幼儿园的其他小朋友。这是一块n*m的矩形巧克力,所以小D准备将它切成n*m块。
由于这块巧克力是一块魔法巧克力,所以必须按照特殊的方法进行切割。巧克力上共有n-1条横线和m-1条竖线,每次小D可以沿着其中的一条线切开某一块。而且这样切一次的代价只跟所切的线有关,而与所切的长度无关。沿着每条横线切一次的代价依次为y1,y2,……yn-1,竖线为x1,x2,……xm-1。
例如,对于图中的巧克力,我们先沿着3条横线切,再沿5条竖线切,最终代价为y1+y2+y3+4*(x1+x2+x3+x4+x5)。
由于小D想要代价最少,所以他向你求助。
格式
输入格式
文件第一行为一个整数T,代表数据组数。
对于每个数据,第一行为两个整数n和m,意义如题目中所述。
接下来n-1行,每行一个整数,分别代表x1,x2,……xn-1。
接下来m-1行,每行一个整数,分别代表y1,y2,……ym-1。
输出格式
对于每个数据输出一行,该行包含一个整数为最小代价。
可证得每次切割应当先切价值最大的。。。。。。。
然后,又一刀切到底。。。。就可以贪心
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--) {
int m,n,mm[55]= {0},nn[55]= {0},c,ans=0,ml=1,nl=1;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)scanf("%d",&c),nn[c]++;
for(int i=1; i<m; i++)scanf("%d",&c),mm[c]++;
for(int i=50; i>=1; i--) {
while(mm[i]!=0||nn[i]!=0) {
if(mm[i]!=0)mm[i]--,ans+=i*nl,ml++;
if(nn[i]!=0)nn[i]--,ans+=i*ml,nl++;
}
}
printf("%d\n",ans);
}
return 0;
}