注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
本帖最后由 庞克莱门汀 于 2023-9-16 23:04 编辑
Q1. Sum of Values at Indices With K Set Bits
暴力模拟即可- class Solution {
- public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
- int sum = 0;
- for (int i = 0; i < nums.size(); i++) {
- int cnt = 0;
- int temp = i;
- while (temp > 0) {
- if (temp % 2 != 0) cnt++;
- temp >>= 1;
- }
- if (cnt == k) sum += nums.get(i);
- }
- return sum;
- }
- }
复制代码 Q2. Happy Students
不难证明,选x个学生的方案有且仅有一种。所以sort之后直接便利即可。- class Solution {
- public int countWays(List<Integer> nums) {
- int n = nums.size();
- Collections.sort(nums);
- int ret = 0;
- if (nums.get(0) > 0) ret ++;
- if (nums.get(n - 1) < n) ret ++;
- for (int i = 1; i < n; i++) {
- int left = nums.get(i - 1);
- int right = nums.get(i);
- if (i > left && i < right) ret++;
- }
- return ret;
- }
- }
复制代码 Q3.Maximum Number of Alloys
每一个机器有个最优解,对所有机器取max
每一个机器通过二分搜索拿到最优解,注意这里二分又边界是21e8, 一开始写的1e8发现hidden case过不了。这里2*1e8是因为 budget和 库存 最大值为1e8,两个相加。- class Solution {
- public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) {
- int max = 0;
- for (List<Integer> compo : composition) {
- max = Math.max(max, helper(n, k, budget, stock, compo, cost));
- }
- return max;
-
- }
-
- private int helper(int n, int k, int budget, List<Integer> stock, List<Integer> compo, List<Integer> cost) {
- int remain = budget;
- int left = 0, right = (int)(2 * 1e8);
- while (left + 1 < right) {
- int mid = left + (right - left) / 2;
- if (ok(mid, budget, compo, stock, cost)) left = mid;
- else right = mid;
- }
-
- if (ok(right, budget, compo, stock, cost)) return right;
- if (ok(left, budget, compo, stock, cost)) return left;
- return -1;
- }
-
- private boolean ok(int target, int budget, List<Integer> compo, List<Integer> stock, List<Integer> cost) {
- long demand = 0L;
- if (target == 0) return true;
-
- for (int i = 0; i < compo.size(); i++) {
- demand += (long)compo.get(i) * cost.get(i);
- }
-
- long total = demand * target;
- for (int i = 0; i < stock.size(); i++) {
- if (stock.get(i) >= (long)target * compo.get(i)) total -= (long)cost.get(i) * target * compo.get(i);
- else total -= (long)cost.get(i) * stock.get(i);
- }
- return total <= budget;
- }
- }
复制代码 |