员工派遣(200)

文章讨论了一个关于员工派遣的问题,需要在满足特定规则(如工号限制和国家需求)下找到最小的工号k,通过暴力计算和二分查找算法解决。重点在于优化数据处理以提高效率。
摘要由CSDN通过智能技术生成

员工派遣(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

输入:177 431 2000 100000000
输出:100232558

解题思路

这题首先想到的就是暴力计算,代码很简单,数据太大会超时,第二个用例2s,要求要1s。

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int x = sc.nextInt();
			int y = sc.nextInt();
			int cx = sc.nextInt();
			int cy = sc.nextInt();
			int shareNum = 0; //存储公共的数据
			int nx =0; // 只能放入x的数据
			int ny =0; // 只能放入y的数据
			int curIndex =1;
			for(int i=1;;i++) {
				if(i%x!=0 && i%y!=0) {//既可以放入x又可以放入y,则放入公共里面
					shareNum +=1;
				}else if(i%x!=0) {
					if(nx< cx) {
						nx +=1;
					}
				}else if(i%y!=0) {
					if(ny< cy) {
						ny +=1;
					}
				}
				if(nx+ny+shareNum == cx+cy) {
					curIndex = i;
					break;
				}
			}
			System.out.println(curIndex);
		}
	}

二分查找,

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int x = sc.nextInt();
			int y = sc.nextInt();
			int cx = sc.nextInt();
			int cy = sc.nextInt();
			long min =1;
			long max = (long)Math.pow(10, 9);
			while(true) {
				if(min >= max)break;
				long mid = (min + max) >> 1;
				 /*1-k之间的数全部由这4类数组成: k/x=能除近x的个数, k/y=能出尽y的个数, k/(x*y)=xy的公倍数个数

						 剩下既不能出尽x也不能出尽y的个数 k- k/x -k/y + k/(x*y)*/
				long target = Math.max(0, cx - (long)mid / y + (long)mid / (x * y)) 
		                 + Math.max(0, cy - (long)mid / x + (long)mid / (x * y));
				if(mid - (long)mid / x - (long)mid / y + (long)mid / (x * y) >= target) {
					max = mid;
				}else {
					min = mid+1;
				}
			}
			System.out.println(min);
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值