给出两个数组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;
}
}