1、題目描述
火車站附近的貨物中轉站負責將到站貨物運往倉庫,小明在中轉站負責調度 2K 輛中轉車(K輛干貨中轉車,K 輛濕貨中轉車)貨物由不同供貨商從各地發來,各地的貨物是依次進站,然后小明按照卸貨順序依次裝貨到中轉車,一個供貨商的貨只能裝到一輛車上不能拆裝,但
是一輛車可以裝多家供貨商的貨:中轉車的限載貨物量由小明統一指定,在完成貨物中轉的前提下,請問中轉車的統一限載貨物數最小值為多少。
2、輸入描述
第一行 length 表示供貨商數量 1 <= length <= 104;
第二行 goods 表示供貨數數組 1 <= goods[i] <= 104;
第三行 types[i]表示對應貨物類型,types[i]等于 0 或者 1,其中 0 代表干貨,1 代表濕貨;
第四行 k 表示單類中轉車數量 1 <= k <= goods.length;
3、輸出描述
運行結果輸出一個整數,表示中轉車統一限載貨物數。
備注:中轉車最多跑一趟倉庫。
用例:
輸入
4
3 2 6 3
0 1 1 0
2輸出
6ps:
貨物1和貨物4為干貨,由2輛干貨中轉車中轉,每輛車運輸一個貨物,限載為3
貨物2和貨物3為濕貨,由2輛濕貨中轉車中轉,每輛車運輸一個貨物,限載為6
這樣中轉車統一限載貨物數可以設置為6(干貨車和濕貨車限載最大值),是最小的取值
溫馨提示!!!
華為OD機試考試官方會對考生代碼查重。華為od機試因為有題庫所以有很大的概率抽到原題。如果碰到了題庫中的原題,千萬不要直接使用題解中的代碼,一定要做些修改,比如代碼中的變量名,除此之外,代碼的組織結構和邏輯也要進行一些改變,所以在日常的刷題中,要提前編寫好屬于自己的代碼。
4、題解
根據題目中的描述,遍歷每一個貨物,判斷是干貨還是濕貨,然后判斷當前車是否能夠裝下這個貨物,若當前能夠裝下,則將貨物裝入車,若裝不下時,若當前的干貨車或濕貨車已經達到了最大數量,則返回無法按照限制裝貨,否則,將干貨車或濕貨車數量+1,將貨物裝入新的車,計算出最大最小限載數,使用二分法不斷地求解滿足要求的最小限載數。
代碼如下:
public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.parseInt(sc.nextLine());int[] goods = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();// 0代表干貨,1代表濕貨int[] types = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();// 單類中轉車數量int k = sc.nextInt();// 初始最小限和最大限載貨物數int minLimit = 0;int maxLimit = 0;for (int i = 0; i < n; i++) {minLimit = Math.max(minLimit, goods[i]);maxLimit += goods[i];}while (minLimit <= maxLimit) {int limit = (minLimit + maxLimit) / 2;int dryCarCount = 0;int wetCarCount = 0;int dryCarSum = 0;int wetCarSum = 0;// 是否可以限載貨物boolean isCan = true;// 遍歷供貨商,按照限載貨物數裝貨到中轉車for (int i = 0; i < n && isCan; i++) {if (types[i] == 0) {// 干貨if (dryCarSum + goods[i] <= limit) {dryCarSum += goods[i];} else {if (dryCarCount + 1 == k) {// 超過限載貨物數且已經達到干貨中轉車數量上限isCan = false;} else {// 超過限載貨物數但還未達到干貨中轉車數量上限dryCarCount += 1;dryCarSum = goods[i];}}} else {// 濕貨if (wetCarSum + goods[i] <= limit) {wetCarSum += goods[i];} else {if (wetCarCount + 1 == k) {// 超過限載貨物數且已經達到濕貨中轉車數量上限isCan = false;} else {// 超過限載貨物數但還未達到濕貨中轉車數量上限wetCarCount += 1;wetCarSum = goods[i];}}}}if (isCan) {maxLimit = limit - 1;} else {minLimit = limit + 1;}}System.out.println(minLimit);
}
執行結果如下: