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

news/2024/11/28 22:00:22/

火车站附近的货物中转站负责将到站货物运往仓库,小明在中转站负责调度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]);elsewet_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;elseleft = 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 matchclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right#并查集模板
class UF:def __init__(self, n=0):self.count = nself.item = [0 for x in range(n+1)]for i in range(n):self.item[i] = idef find(self, x):if (x != self.item[x]):self.item[x] = self.find(self.item[x])return 0return xdef 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_itemself.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 Truefor j in range(k):if cap[j] >= data[i]:cap[j] -= data[i]if dfs(i + 1):return Truecap[j] += data[i]if cap[j] == x:breakreturn Falser = 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) // 2cap = [x] * kif dfs(0):right = xelse:left = x + 1r = max(r, left)
print(r)

JS代码

1


http://www.ppmy.cn/news/39234.html

相关文章

【Go进阶】Goroutine 实现原理

目录 1、GMP模型 2、Goroutine调度策略 队列轮转 系统调用 工作量窃取

基于像素-原型对比的弱监督语义分割

目录Weakly Supervised Semantic Segmentation by Pixel-to-Prototype Contrast摘要本文方法Pixel-to-Prototype ContrastPrototype EstimationCross-view ContrastIntra-view Contrast消融实验Weakly Supervised Semantic Segmentation by Pixel-to-Prototype Contrast 摘要 …

git 实际开发中使用-解决问题

前言 git代码版本管理工具&#xff0c;打破常规的物理传输&#xff0c;更新&#xff0c;合并&#xff0c;回滚提高了开发效率和可追溯性。 网上的资料会把所有的命令都很全也很多&#xff0c;导致对刚刚了解的同学不友好&#xff0c;很难实际使用。 每个人都有自己使用git的习…

numpy中transpose详解

transpose用于numpy中高维度数组的轴变换&#xff0c;在二维情况下就是通常说的转置。该方法很不好理解&#xff0c;本文详细介绍该方法。 该方法有两个实现&#xff0c;分别是numpy.ndarray.transpose和numpy.transpose&#xff0c;两者分别是类成员方法和独立的方法&#xf…

python字符编码

目录 ❤ 前言 文本编辑器存取文件的原理&#xff08;nodepad&#xff0c;pycharm&#xff0c;word&#xff09; python解释器执行py文件的原理 &#xff0c;例如python test.py 总结 ❤ 什么是字符编码? ASCII MBCS Unicode ❤ 字符编码的发展史 阶段一: 现代计算…

一篇文章看懂C++三大特性——多态的定义和使用

目录 前文 一&#xff0c;什么是多态&#xff1f; 1.1 多态的概念 二&#xff0c; 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.3.1 虚函数重写的两个例外 2.4 C override 和 final 2.5 重载,重写(覆盖),隐藏(重定义)的区别 三&#xff0c;抽…

Pandas高级操作,建议收藏(一)

在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作&#xff0c;有时需要对数据增删字段。下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序的使用。 复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何…

UE4 C++编写自定义动画蓝图节点

UE中自带的动画蓝图节点有限&#xff0c;在实现一些功能时需要通过C编写一些自定义的动画蓝图节点&#xff0c;本文就来讲解其基础实现&#xff0c;自定义节点最终效果如下&#xff1a; 源文件下载&#xff1a;https://download.csdn.net/download/grayrail/87654290 1.流程简…