查看: 925| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] Weekly Contest 363 - 三题哥+1

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 庞克莱门汀 于 2023-9-16 23:04 编辑

Q1. Sum of Values at Indices With K Set Bits

暴力模拟即可
  1. class Solution {
  2.     public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
  3.         int sum = 0;
  4.         for (int i = 0; i < nums.size(); i++) {
  5.             int cnt = 0;
  6.             int temp = i;
  7.             while (temp > 0) {
  8.                 if (temp % 2 != 0) cnt++;
  9.                 temp >>= 1;
  10.             }
  11.             if (cnt == k) sum += nums.get(i);
  12.         }
  13.         return sum;
  14.     }
  15. }
复制代码
Q2.  Happy Students

不难证明,选x个学生的方案有且仅有一种。所以sort之后直接便利即可。
  1. class Solution {
  2.     public int countWays(List<Integer> nums) {
  3.         int n = nums.size();
  4.         Collections.sort(nums);
  5.         int ret = 0;
  6.         if (nums.get(0) > 0) ret ++;
  7.         if (nums.get(n - 1) < n) ret ++;
  8.         for (int i = 1; i < n; i++) {
  9.             int left = nums.get(i - 1);
  10.             int right = nums.get(i);
  11.             if (i > left && i <  right) ret++;
  12.         }
  13.         return ret;      
  14.     }
  15. }
复制代码
Q3.Maximum Number of Alloys

每一个机器有个最优解,对所有机器取max


每一个机器通过二分搜索拿到最优解,注意这里二分又边界是21e8, 一开始写的1e8发现hidden case过不了。这里2*1e8是因为 budget和 库存 最大值为1e8,两个相加。
  1. class Solution {
  2.     public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) {
  3.         int max = 0;
  4.         for (List<Integer> compo : composition) {
  5.             max = Math.max(max, helper(n, k, budget, stock, compo, cost));
  6.         }
  7.         return max;
  8.         
  9.     }
  10.    
  11.     private int helper(int n, int k, int budget, List<Integer> stock, List<Integer> compo, List<Integer> cost) {
  12.         int remain = budget;
  13.         int left = 0, right = (int)(2 * 1e8);
  14.         while (left + 1 < right) {
  15.             int mid = left + (right - left) / 2;
  16.             if (ok(mid, budget, compo, stock, cost)) left = mid;
  17.             else right = mid;
  18.         }
  19.         
  20.         if (ok(right, budget, compo, stock, cost)) return right;
  21.         if (ok(left, budget, compo, stock, cost)) return left;
  22.         return -1;
  23.     }
  24.    
  25.     private boolean ok(int target, int budget, List<Integer> compo, List<Integer> stock, List<Integer> cost) {
  26.         long demand = 0L;
  27.         if (target == 0) return true;

  28.         for (int i = 0; i < compo.size(); i++) {
  29.             demand += (long)compo.get(i) * cost.get(i);
  30.         }
  31.         
  32.         long total = demand * target;
  33.         for (int i = 0; i < stock.size(); i++) {
  34.             if (stock.get(i) >= (long)target * compo.get(i)) total -= (long)cost.get(i) * target * compo.get(i);
  35.             else total -= (long)cost.get(i) * stock.get(i);
  36.         }
  37.         return total <= budget;
  38.     }
  39. }
复制代码

评分

参与人数 1大米 +2 收起 理由
14417335 + 2 给你点个赞!

查看全部评分


上一篇:Leetcode【LC周赛赛后发布会】Weekly Contest 363
下一篇:[Leetcode] [LC周赛赛后发布会] Weekly Contest 363
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表