巧克力
来源:互联网 发布:欧洲人 知乎 编辑:程序博客网 时间: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
- 巧克力
- 巧克力
- 巧克力
- 巧克力
- 巧克力
- 巧克力
- 巧克力2
- 巧克力3
- 巧克力棒
- 分巧克力
- 分巧克力
- 吃巧克力
- 分巧克力
- 分巧克力
- 巧克力以及其他
- 巧克力又来了!!!!
- 数学……巧克力?
- 德芙巧克力的故事
- 转一篇比较详细介绍FatFs文件系统移植的文章
- PrestoDB 大数据查询引擎
- 设置动画结束的监听事件
- Caffe源码(十一):io.cpp 分析
- Objective-c runtime方法替换引发的死循环
- 巧克力
- java计算时间
- 任意给定的一串字母,统计字符串里面的大写字母和小写字母的个数。
- Spring 4 MVC HelloWorld 纯注解方式(带源码)
- 安卓设置横竖屏及生命周期问题
- 我的奋斗
- Lucas定理与Euler筛
- HDU1509(STL优先队列初学)
- zynq_7z020内存调试