P1094 矩形分割|tyvj


**

背景

**

YHOI Train#4 Problem 1


**

描述

**

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

**

输入格式

**

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

**

输出格式

**

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

**

输入

**

2 2 
3 
3 

**

输出

**

9

**

备注

**

对于60%的数据,有1 ≤ N ,M≤ 100;
对于100%的数据,有1 ≤ N,M ≤ 2000。

Vivian Snow


**

题解

**

仔细想一想可以知道,一共切多少刀都是确定的,而且对于每一行、每一列无论怎么切,最后切的次数排序一下是一个不变的序列 唯一的区别就是某一列(行)对应的切了几下 所以我们贪心思路是 :代价最大的那个切的尽量少 。所以按照代价排序一下。


**

Code

**

#include 
#include 
#include 
using namespace std;

struct data{int w,cl;};
const int maxn=2010;
data d[maxn*2];
int lc[2];
inline bool cmp(data x,data y){return x.w>y.w;}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;iscanf("%d",&d[i].w);
        d[i].cl=0;
    }
    for(int i=1;iscanf("%d",&d[i+n-1].w);
        d[i+n-1].cl=1;
    }
    sort(d+1,d+1+n+m-2,cmp);
    int ans=0;
    for(int i=1;i<=n+m;i++)
    {
        ans+=(lc[d[i].cl]+1)*d[i].w;
        lc[d[i].cl^1]++;
    }
    printf("%d",ans);
    return 0;
}


——既然选择了远方,便只顾风雨兼程



欢迎各犇指正~

你可能感兴趣的:(tyvj,贪心)