OD C卷 - 员工派遣

news/2024/7/24 6:53:20 标签: 算法, python

员工派遣(200)

  • 员工工号连续,且从1开始;
  • 从工号1-k中选择员工 派去 x国(需要nx人)、y国(需要ny人);
  • 工号为x倍数的不去x国,工号为y倍数的不去y国;
  • 找到最小的k,使得可以将编号1-k中的员工分配给x国、y国,且满足两国需求;
    输入描述:
    四个整数x,y,nx,ny;
    2<x<y<30000,且x、y均为质数
    1<nx,ny < 10^9
    nx + ny <= 10^9
    输出描述:
    满足条件的最小的k

示例1
输入:
2 3 3 1
输出:
5

暴力求解:

  • 从i=1开始,当nx、ny任意一个大于0(还需要人), 则继续循环
    • 若 i 既不是x的倍数,也不是y的倍数,则可以去x国,也可以去y国,分配条件是看谁需要的人多,即nx、ny谁大,就优先分配给谁;
    • 若i是x的倍数,则去y国(ny-=1);
    • 若i是y的倍数,则去x国 (nx-=1);
    • 若i同时是x 、y的倍数,则跳过
    • i += 1 继续循环
  • 最后输出 i-1 ,即为最小的k值;
python"># 用例
# 2 3 3 1
# 5

# 3 5 20 30
# 53

# 7 19 15 13
# 28

# 23 71 71 23
# 94

# 3 7 20 5
# 29

# 23 71 7100 2300
# 9405

# 23 71 710000 230000
# 940575

#
class Dispatch:
    def solution(self, x, y, nx, ny):
        i = 1
        while nx > 0 or ny > 0:
            if i % x == 0 and i % y == 0:
                i += 1
                continue
            elif i % x == 0:
                ny -= 1
            elif i % y == 0:
                nx -= 1
            else: # 都可以去
                if nx >= ny:
                    nx -= 1
                else:
                    ny -= 1
            i += 1

        print(i-1)


if __name__ == '__main__':
    dispatch = Dispatch()
    while True:
        try:
            x, y, nx, ny = list(map(int, input().strip().split()))
            dispatch.solution(x, y, nx, ny)
        except KeyboardInterrupt: # EOFError
            break

二分法:

python"> 
# 输入
nums = [int(x) for x in input().split()]
x, y, count_x, count_y = nums

left = 1 # k 的最小值
# count_x + count_y <= 10^9
right = pow(10, 9)  # k 最大值

# 求满足条件的  k的最小值
while True:
    if left >= right:
        break
    else:
        k = (left + right) >> 1  # 地板除 //  得到中间数 k

        # 1->k中 能整除y的个数 k/y
        # 能整除x的个数 k/x
        # 既能整除x 又能整除y 的个数 k/x*y

        # count_x - int(k/y)  得到一部分 既不能被x也不能被y整除数值
        target = max(0, count_x - int(k / y) + int(k / (x * y))) \
                 + max(0, count_y - int(k / x) + int(k / (x * y)))

        # 左边是 既不能被x整除也不能被y整除 + 2*(既能被x整除也能被y整除)
        if k - int(k / x) - int(k / y) + int(k / (x * y)) >= target:
            right = k
        else :
            left = k + 1

print(left)

 


http://www.niftyadmin.cn/n/5443008.html

相关文章

Android Launcher开发注意事项

在开发Android Launcher时&#xff0c;需要关注性能、用户体验、权限管理、兼容性等方面&#xff0c;同时遵循相关的开发者政策和最佳实践。有几个重要的注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…

误删了Linux系统的libm.so.6文件与libm-2.27.so的软链接导致的开机出现kernel panic的解决方案(图文U盘救援详细教程)

事情起因 最近在做嵌入式视觉&#xff0c;捣弄rknn3588&#xff0c;在推理过程中报了一个错&#xff0c;就是说我的GLIBC的版本太低了&#xff0c;我也没有多想&#xff0c;想着升一下版本就好了&#xff0c;然后找到了这篇博客。【请谨慎操作】Ubuntu18.04升级GLIBC_2.29&…

利用autodl服务器跑模型

1. 租用服务器 本地改模型 服务器 将改进好的、数据集处理好的模型压缩为zip文件上传到阿里云盘打开服务器AUTODL服务器&#xff0c;在主页中选择容器实例 在此位置进行开关机操作&#xff0c;若停止服务器&#xff0c;必须关机&#xff0c;不然会一直扣钱 2. 运行模型 选择…

20.python——数据读取与存储

一、一维数据 1.一维数据在python中的表示形式 2.一维数据在文件中的存储方式 3.一维数据的处理 ls ["北京","上海","深圳","广州"] f open("city.csv","w") s ",".join(ls) f.write(s) f.close…

GESP图形化编程一级认证真题 2024年3月

GESP 图形化一级试卷 &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 一、单选题&#xff08;每题 3 分&#xff0c;共 30 分&#xff09; 1、小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑的是鸿蒙&#xff0c;这个 鸿蒙是…

串口111

1.开启时钟 把需要使用的USART和GPIO的时钟打开 2.GPIO初始化 把TX配置成复用输出&#xff0c;RX配置成输入 3.配置USART 直接使用一个结构体即可将所有参数配置完成 4.开关控制 如果需要仅发送的功能&#xff0c;就直接开启USART&#xff0c;初始化到此结束 如果还需要接收…

【Java常用API】简单爬虫练习题

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

Linux系统之安装java开发环境

1 java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出&#xff0c;后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff…