巧克力

来源:互联网 发布:欧洲人 知乎 编辑:程序博客网 时间:2024/04/19 12:44

在某年某月某日,小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;}




2 0
原创粉丝点击