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