给出两个数组a,b。a[i]代表第i部影片的版权费,b[i]代表第i部影片能卖的钱,现在本金k,问最后最多能赚多少钱。(每部影片只需要买一次版权,只能卖一次。)
样例
样例 1:
输入:a = [3,1,5], b = [4,3,100], k = 1
输出:4
解释:先买第2部影片,再卖出,再买第1部影片,再卖出,最后本金变为4。
样例 2:
输入:a = [3,1,5], b = [4,3,100], k = 10
输出:108
解释:将全部影片买下,卖出,最后本金变为108。
注意事项
- 所有输入均为不超过
100000的正整数。 - 数组大小不超过
10000。
解题思路:
贪心。新建一个Moive类用来存储电影的买入费和卖出费,方便后续排序。过滤掉不赚钱的影片后,先按照买入费升序,再按照卖出费降序排列,就能找到最多赚的钱。
public class Solution {
class Moive{
public int buy;
public int sell;
Moive(int buy, int sell){
this.buy = buy;
this.sell = sell;
}
}
/**
* @param a: The cost of the film
* @param b: The price of the selling of the film
* @param k: The principal
* @return: The answer
*/
public int bigBusiness(int[] a, int[] b, int k) {
// Write your code here
Moive[] movies = new Moive[a.length];
for(int i=0; i<a.length; i++){
//过滤掉不赚钱的生意
if(a[i] >= b[i]){
a[i] = 0;
b[i] = 0;
}
movies[i] = new Moive(a[i], b[i]);
}
Arrays.sort(movies, new Comparator<Moive>(){
@Override
public int compare(Moive m1, Moive m2){
if(m1.buy != m2.buy)
return m1.buy - m2.buy; //按照买入费升序排列
return m2.sell - m1.sell; //按照卖出费降序排列
}
});
int res = k;
for(int i=0; i<movies.length && res >= movies[i].buy; i++){
res -= movies[i].buy;
res += movies[i].sell;
}
return res;
}
}

本文介绍了一种基于贪心算法的电影买卖策略,通过合理选择购买和出售电影的顺序,以有限的本金实现利润最大化。策略首先筛选出能盈利的电影,然后按买入成本升序和卖出价格降序进行排序,确保每次交易都能获得最大收益。
561

被折叠的 条评论
为什么被折叠?



