您的位置:首页 > 其它

切割木板 (贪心)

2016-02-29 11:00 232 查看
木板长为:21

输入:

N=3

L={8,5,8}

输出:

34

由于木板的切割顺序不确定,自由度很高.首先,切割的方法可以参见二叉树,每一个叶子节点就对应了切割出的一块块木板.叶子节点的深度就对应了为了得到对应木板所需的切割次数,开销的合计就是个叶子节点的

木板的长度*节点的深度

的总和.

最短的板与次短板的节点应当是兄弟节点

typedef long long ll;

int N,L[MAX];

void solve()
{
ll ans=0;
//直到计算到木板为1块时为止
while(N>1){
int mii1=0,mii2=1;
if(L[mii1]>L[mii2])  swap(mii1,mii2);

for(int i=2; i<N; i++){
if(L[i]<L[mii1]){
mii2=mii1;
mii1=i;
}
else if(L[i]<Lmii2){
mii2=i;
}
}
//将两块板拼合
int t=L[mii1]+L[mii2];
ans+=t;

if(mii1 == N-1)  swap(mii1.mii2);
L[mii1]=t;
L[mii2]=L[N-1];
N--;
}
printf("%d\n"ans);
}


<<挑战程序设计竞赛>>读后感
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: