当前位置: 首页 > article >正文

华为OD机试-统一限载最小值-2022Q4 A卷-Py/Java/JS

火车站附近的货物中转站负责将到站货物运往仓库,小明在中转站负责调度2K辆中转车( K 辆干货中转车, K 辆湿货中转车)。货物由不同供货商从各地发来,各地的货物是依次进站,然后小明按照卸货顺序依次装货到中转车上,一个供货商的货只能装到一辆车上,不能拆装,但是一辆车可以装多家供货商的货;中转车的限载货物量由小明统一制定,在完成货物中转的前提下,请问中转车的统一限载货物数最小值为多少。
输入描述:
第一行 length 表示供货商数量1<= length <=104
第二行 goods 表示供货数数组,1<= goods [ i ]<=104
第三行 types 表示对应货物类型, types [ i ]等于0或者1,0代表干货,1代表湿货第四行 k 表示单类中转车数量1<= k <= goods . length 
输出描述:

运行结果输出一个整数,表示中转车统一限载货物数

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

输入
4
3 2 6 3
0 1 1 0
2
输出

6

说明
货物1和货物4为干货,由2两干货中转车中转、每辆车运输一个货物、限载为3货物2和货物3为湿货,由2两湿货中转车中转,每辆车运输一个货物,限载为6这样中转车统一限载货物数可以设置为6(千货车和湿货车限载最大值),是最小的取值.

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

输入
4
3 2 6 8
0 1 1 1
1
输出

16

说明

货物1为干货,由1两千货中转车中转,限载为3
货物2、货物3和货物4为湿货,由1两湿货中转车中转,限载为16
这样中转车统一限载货物数可以设置为16 (千货车和湿货车限载最大值),是最小的取值
备注:
1.中转车最多跑一趟仓库

Java 代码

import java.util.stream.Stream;
import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
 
 
class Main {
 
	public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        Integer[] goods = new Integer[num];
        for (int i=0;i<num;i++) {
            goods[i] = in.nextInt();
        }
        
        ArrayList<Integer> wet_goods = new ArrayList<Integer>();
        ArrayList<Integer> dry_goods = new ArrayList<Integer>();
        for (int i=0;i<num;i++) {
            if (in.nextInt() == 0) 
                dry_goods.add(goods[i]);
            else
                wet_goods.add(goods[i]);
        }
        int k = in.nextInt();
 
        List<ArrayList<Integer>> datas = new ArrayList<ArrayList<Integer>>();
        datas.add(wet_goods);
        datas.add(dry_goods);
 
        int result = 0;
        for (ArrayList<Integer> data : datas){
            data.sort(Comparator.naturalOrder());
            int left = data.get(data.size()-1);
            int right = data.stream().reduce (Integer::sum).orElse (0);
            while (left < right) {
                int x = (left + right) / 2;
                int[] cap = new int[k];
                for (int i=0;i<k;i++) {
                    cap[i] = x;
                }
                if (dfs(0, data.size(), k, cap, data,x))
                    right = x;
                else
                    left = x + 1;
            }
                
            result = Math.max(result, left);
        }
 
        System.out.println(result);
        
 
    }
 
    public static boolean dfs(int i, int n, int k, int[] cap, ArrayList<Integer> data,int x){
        if (i == n)
            return true;
        for (int j=0;j<k;j++){
            if (cap[j] >= data.get(i)){
                cap[j] -= data.get(i);
                if (dfs(i + 1, n, k, cap, data,x))
                    return true;
                cap[j] += data.get(i);
            }
            if (cap[j] == x)
                break;
        }
        return false;
    }
 
}

Python代码

import functools
import collections
import math
from itertools import combinations
from re import match
 
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
 
#并查集模板
class UF:
    def __init__(self, n=0):
        self.count = n
        self.item = [0 for x in range(n+1)]
        for i in range(n):
            self.item[i] = i
    def find(self, x):
        if (x != self.item[x]):
            self.item[x] = self.find(self.item[x])
            return 0
        return x
    
 
    def union_connect(self, x, y):
        x_item = self.find(x)
        y_item = self.find(y)
    
        if (x_item != y_item):
            self.item[y_item] = x_item
            self.count-=1
 
#输入
num = int(input())
datas = []
datas.append([int(x) for x in input().split(" ")])
datas.append([int(x) for x in input().split(" ")])
k = int(input())
 
 
dry_goods = []
wet_goods = []
for i in range(len(datas[0])):
	if datas[1][i] == 0:
		dry_goods.append(datas[0][i])
	else:
		wet_goods.append(datas[0][i])
 
def dfs(i):
	if i == n:
		return True
	for j in range(k):
		if cap[j] >= data[i]:
			cap[j] -= data[i]
			if dfs(i + 1):
				return True
			cap[j] += data[i]
		if cap[j] == x:
			break
	return False
 
r = 0
for data in [dry_goods, wet_goods]:
	n = len(data)
	data.sort(reverse=True)
	left, right = max(data), sum(data)
	while left < right:
		x = (left + right) // 2
		cap = [x] * k
		if dfs(0):
			right = x
		else:
			left = x + 1
	r = max(r, left)
print(r)

JS代码

1


http://www.kler.cn/a/7596.html

相关文章:

  • 北京大学c++程序设计听课笔记101
  • 【C++】list 与 string 基础与实现字符串操作
  • vue 项目使用 nginx 部署
  • SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)
  • 摄像机视频分析软件下载LiteAIServer视频智能分析软件抖动检测的技术实现
  • 论文精读(笔记)
  • 【Linux】信号的捕捉
  • 先移动后旋转,先旋转后移动的区别
  • 【Django网络安全】跨站点请求伪造保护,CSRF如何正确使用
  • day18 二叉树遍历总结
  • ArrayList与LinkList的区别
  • minikube apiserver无法启动问题解决
  • C++并发与多线程笔记八:async、future、packaged_task、promise
  • 刷题记录|Day48 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
  • arm系列交叉编译器各版本区别
  • 如何选择理想的三相浪涌保护器?
  • 【Ruby学习笔记】13.Ruby 迭代器及文件的输入与输出
  • 【vSphere | Python】vSphere Automation SDK for Python Ⅲ—— vCenter Datacenter APIs
  • 为什么无法跨centos、ubuntu、rocky linux 发行版本进行系统升级?
  • xinput1_3.dll缺失了如何去修复?xinput1_3.dll解决方法分享
  • 释放AIoT商业价值 | 2023高通广和通智能物联网技术开放日圆满落幕
  • srs流媒体录制视频
  • 22.SSM-JdbcTemplate总结
  • 贯穿设计模式第二话--开闭职责原则
  • 区块链学习笔记(3)BTC协议
  • 运算符重载