【华为OD】C卷真题 200分:员工派遣 --暴力只能20%,二分法才是最优解 JS语言源码实现

  python源码实现:

【华为OD】C卷真题 200分:员工派遣 【手撕代码转OD】 --暴力只能20%,二分法才是最优解 Python源码实现 

【华为OD】C卷真题 200分:员工派遣 【手撕代码转OD】 --暴力只能20%,二分法才是最优解 Python源码实现-CSDN博客

java源码实现:

【华为OD】C卷真题 200分:员工派遣 【手撕代码转OD】 --暴力只能20%,二分法才是最优解 Java源码实现-CSDN博客

C++代码实现:

【华为OD】C卷真题 200分:员工派遣 【手撕代码转OD】 --暴力只能20%,二分法才是最优解 C/C++源码实现-CSDN博客

C语言代码实现:

【华为OD】C卷真题 200分:员工派遣 【手撕代码转OD】 --暴力只能20%,二分法才是最优解 C语言源码实现-CSDN博客 

题目描述:

某公司部门需要派遣员工去国外做项目。现在,代号为x的国家和代号为y的国家分别需要cntx名和cnty名员工。部门每个员工有一个员工号(1,2,3……),工号连续,从1开始。

部长派遣员工的规则:

  • 规则1、从[1,k]中选择员工派遣出去
  • 规则2、编号为x的倍数的员工不能去x国,编号为y的倍数的员工不能去y国

问题:
找到最小的k,使得可以将编号在[1,k]中的员工分配给x国和y国,且满足x国和y国的需求

输入描述

四个整数 x, y, cntx, cnty。(2<=x

输出描述

满足条件的最小的k。

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

2 3 3 1

输出

5

说明

输入说明:

2 -表示国家代号2

3 -表示国家代号3

3 -表示国家2需要3个人

1 -表示国家3需要1个人

      5
              +--------++++++
              |   | 
              |   | 3                       3 
              |   | 
              |   +---+                   -++++---- 
              |       |                   |   | 
            2 |       |                 2 |   |     2 
              |       |                   |   | 
          +----------+       |      ++++++         ------------------+   |   +---+ 
          |           |               |       |   |   | 
        6 |           | 1           4 |       | 1 |   | 1 
          |           |               |       |   |   | 
      +---+           +---------+       +---+       +---+   +---+       +----
      |                   |       |                       |       |    |
    0 |       |            | 0   0 |         |              | 0       |    |
      |                   |       |                       |       |    |
  +---+      +++             +------------------------+                       +---+---+----+---+
  
    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 16   17  18  20 21

题目解析:

        这题使用暴力破解最多只能过20%就会超时,需要使用二分法来确认目标值才可以,

而且还要想办法确定通项式才能真正解决问题。

JS代码实现:

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

function isSend(k, x, y, cntx, cnty) {
  let d0 = 0;
  let a1 = Math.floor(k / x);
  let b1 = Math.floor(k / y);
  let c1 = Math.floor(k / (x * y));
  return (d0 > cntx - (b1 - c1) ? d0 : cntx - (b1 - c1)) + (d0 > cnty - (a1 - c1) ? d0 : cnty - (a1 - c1)) <= k - (a1 + b1) + c1;
}

async function main() {
  const input = await readline();
  const [x, y, cntx, cnty] = input.split(' ').map(Number);
  let lf = cntx + cnty;
  let rg = 1000000000;

  while (lf <= rg) {
    let mid = lf + Math.floor((rg - lf) / 2);
    if (isSend(mid, x, y, cntx, cnty)) {
      rg = mid - 1;
    } else {
      lf = mid + 1;
    }
  }
  console.log(lf);
  rl.close();
}

main();

【华为OD】C卷真题 200分:员工派遣 --暴力只能20%,二分法才是最优解 JS语言源码实现_第1张图片

你可能感兴趣的:(杂谈,华为od,c语言,javascript,java,python,C++,码蚁软件)