• 巧克力


    在某年某月某日,小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
    ",ans);
    	}
    	return 0;
    }




  • 相关阅读:
    how to write a paper
    attention mechanism思考
    OSX-KVM 安装备忘指南: 在KVM虚拟机中运行macOSX Big Sur / Catalina
    Unity CacheServer6.x版本 安装配置说明
    Linux常用命令2
    Ubuntu 18.04 + apache2.4 配置https证书(SSL)笔记
    Linux常用命令随笔
    软件测试-8 集成测试
    软件测试-7 在实际测试时的一些想法
    软件测试-6 白盒测试
  • 原文地址:https://www.cnblogs.com/zzmmm/p/6501177.html
Copyright © 2020-2023  润新知