问题标题: 酷町堂:麻烦各位大佬跟我说一下2610的思路和核心

0
0
已解决
项依凡
项依凡
初级光能
初级光能

农夫约翰在自己的庄园里种了N(1≤N≤25,000)棵景观树,每棵树都有一个高度Mi(1≤Mi≤100,000)。现在约翰想把所有树的高度分别调整到B1,B2,…,BN(1≤Bi≤100,000)。 将一棵树每提高一个单位的高度,约翰需要X(1≤X≤100)元去培养;每降低一个单位的高度,约翰需要花Y(1≤y≤100)元去砍树。 问约翰最少可用多少钱达到目的。

项依凡在2018-07-22 16:13:36追加了内容

农夫约翰在自己的庄园里种了N(1≤N≤25,000)棵景观树,每棵树都有一个高度Mi(1≤Mi≤100,000)。现在约翰想把所有树的高度分别调整到B1,B2,…,BN(1≤Bi≤100,000)。 将一棵树每提高一个单位的高度,约翰需要X(1≤X≤100)元去培养;每降低一个单位的高度,约翰需要花Y(1≤y≤100)元去砍树。 问约翰最少可用多少钱达到目的。

项依凡在2018-07-22 16:14:21追加了内容


也可以说一下样例是如何来的


0
已采纳
李牧之
李牧之
新手光能
新手光能

他问的是最少用多少钱就可以达到目的,所以说只要最后培养完和砍完后他要求的树的高度都有就行

就比如样例上的

3 1 1

1 2 2

并不用一一对应,他要求1格高,并不用用3格的树去砍,因为本来就有1格高的树现在剩下

3 1

2 2

把3格高的树砍成2格,把1格高的树培养成2格,共需要11元。

————————————分割线——————————————————————————

现在再讲一讲思路,首先,先把M和B数组从大到小分别排序,然后一个一个比较,如果相等,不加钱;Mi<Bi,钱就加上(bi-mi)*x,

Mi>Bi,钱加上(Mi-Bi)*y;

————————————分割线——————————————————————————

核心代码:

for(int i=1;i<=N;i++){
    if (M[i]<B[i]) ans+=(B[i]-M[i])*X;
    if (M[i]>B[i]) ans+=(M[i]-B[i])*Y;
}
//排序自己写

 

0
我要回答