leetcode 1648. 销售价值减少的颜色球-耗时99
Problem: 1648. 销售价值减少的颜色球耗时99%二分查找的将整个数组看作是柱状图然后水平线yy0平行于x轴切割柱状图上侧的数字个数应该满足orders但实际情况不可能所以首先找到最符合的数字mid最小值l0最大值r数组的最大值-1l和r都是分割的上边界像[2,5]若用4分割则和是5若用3分割和是549若用2分割和是54312若用1分割和是5432216对每个中值mid求出上侧的数字个数getNum(inventory, mid)二分查找到的结果mid然后若num orders就不停累加mid直到num orders此时只需要在分割水平线下侧累加几个最大值即可考虑到可能存在极小值这些极小值不能用来累加需要满足 inventory[i] mid此时mid–递减的Codeclass Solution { public: const int mod 1e9 7; const int con 1e9; int getNum(vectorint inventory, int mid) { long long num 0; for(int i : inventory) { if(i mid) num i - mid; } if(num con) return INT_MAX; return num; } int maxProfit(vectorint inventory, int orders) { int mx *max_element(inventory.begin(), inventory.end()); int n inventory.size(); unsigned long long l 0, r mx - 1, mid, num, sum 0; while(l r) { mid (l r) / 2; if(getNum(inventory, mid) orders) { r mid - 1; } else { l mid 1; } } num getNum(inventory, mid); while(num orders) { num getNum(inventory, mid); } num 0; for(int i : inventory) { if(i mid) { num i - mid; sum (sum (i (mid 1)) * (i - mid) / 2) % mod; i mid; } } num orders - num; if(num 0) return sum; while(true) { mid--; for(int i : inventory) { if(i mid) { sum (sum i) % mod; i--; num--; } if(num 0) return sum; } } return -1; } };
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2509977.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!