zoukankan      html  css  js  c++  java
  • TYVJ 1094 矩形分割

    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    背景

    YHOI Train#4 Problem 1

    描述

    出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块。
    对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。
    现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。

    输入格式

    输入文件第一行包括N和M,表示长N宽M的矩阵。
    第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。
    第二行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。

    输出格式

    输出一个整数,表示最小代价。

    测试样例1

    输入

    2 2 

    输出

    9

    备注

    对于60%的数据,有1 ≤ N ,M≤ 100;
    对于100%的数据,有1 ≤ N,M ≤ 2000。
     
     
    题目大意:把一个n*m的矩形切成1*1的小正方形,不能叠着切。
    每切一刀都有代价,求最少代价。
    题解:贪心。
    先把代价大的那一刀给切了。
    代码:
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    #define maxn 2017
    #define inf 100000000
    using namespace std;
    
    int l1,l2,n,m,vc,vr,row[maxn],col[maxn];
    LL ans;
    
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<n;i++)scanf("%d",&row[i]);
        for(int i=1;i<m;i++)scanf("%d",&col[i]);
        sort(row+1,row+n);sort(col+1,col+m);
        l1=n-1;l2=m-1;vc=1;vr=1;
        while(1){
            if(!l1&&!l2)break;
            if(l1==0)row[l1]=-inf;
            if(l2==0)col[l2]=-inf;
            if(row[l1]>=col[l2]){
                vr++;
                ans+=vc*row[l1--];
            }else  vc++,ans+=vr*col[l2--];
        }
        printf("%lld
    ",ans);
        return 0;
    }
     
  • 相关阅读:
    在 Eclipse Workbench 之外使用 Eclipse GUI
    GB2312,GBK,Unicode
    木偶一之推荐系统
    Matlab:任意矩阵计算分布密度(海明距离的分布密度)
    live555在arm linux下的交叉编译,并下载的Arm板播放H264文件
    java设计模式之原型模式
    HDU 1102
    poj3661另一种做法(滚动数组)
    基于QT的小游戏细菌病毒战
    某代码查看器的保护突破
  • 原文地址:https://www.cnblogs.com/zzyh/p/7642475.html
Copyright © 2011-2022 走看看