描述
输入int型数组,询问该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),不是5的倍数也不是3的倍数能放在任意一组,可以将数组分为空数组,能满足以上条件,输出true;不满足时输出false。
数据范围:每个数组大小满足 1≤n≤50
,输入的数据大小满足 ∣val∣≤500
输入描述:
第一行是数据个数,第二行是输入的数据
输出描述:
返回true或者false
示例1
输入: 4 1 5 -5 1 输出: true 说明: 第一组:5 -5 1 第二组:1
示例2
输入: 3 3 5 8 输出: false 说明: 由于3和5不能放在同一组,所以不存在一种分法。
解法
- 先分3的倍数和倍数5。因为,3的倍数和倍数5是不能在一组,假设两组是a、b,则3的倍数放a组,倍数5的数放b组
- 再分非3的倍数和倍数5。这里就可以用集合枚举的方式,穷举所有可能。
/** * Welcome to https://waylau.com */ package com.waylau.nowcoder.exam.oj.huawei; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * HJ93 数组分组. * 输入int型数组,询问该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中, * 所有3的倍数在另一个组中(不包括5的倍数),不是5的倍数也不是3的倍数能放在任意一组, * 可以将数组分为空数组,能满足以上条件,输出true;不满足时输出false。 * 数据范围:每个数组大小满足 `1≤n≤50` ,输入的数据大小满足 `∣val∣≤500` * 输入描述: * 第一行是数据个数,第二行是输入的数据 * 输出描述: * 返回true或者false * 示例1 * ``` * 输入: * 4 * 1 5 -5 1 * 输出: * true * 说明: * 第一组:5 -5 1 * 第二组:1 * ``` * 示例2 * ``` * 输入: * 3 * 3 5 8 * * 输出: * false * * 说明: * 由于3和5不能放在同一组,所以不存在一种分法。 * * @since 1.0.0 2022年8月29日 * @author <a href="https://waylau.com">Way Lau</a> */ public class HJ093ArrayGrouping { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); List<Integer> list = new ArrayList<>(); int sum3 = 0, sum5 = 0, sum = 0; for (int i = 0; i < n; i++) { int t = in.nextInt(); if (t % 5 == 0) { sum5 += t; } else if (t % 3 == 0) { sum3 += t; } else { sum += t; list.add(t); } } int target = Math.abs(sum5 - sum3); // 按5的倍数和3的倍数分组时,两组的差值target if (sum == target) { // 差值与剩余数的总和相等,即可以分组,直接把所有的数放在较小值那一组即可 System.out.println("true"); continue; } System.out.println(check(list, target)); } in.close(); } // 判断是否可分组 // 把剩余数按所有情况分组,当两组的差值与target相等时,即可正确分组 private static boolean check(List<Integer> list, int target) { for (int i = 0; i < list.size() - 1; i++) { for (int j = i + 1; j < list.size(); j++) { List<Integer> list1 = list.subList(i, j); // 将list分为两组,list1和(list2+list3) List<Integer> list2 = list.subList(0, i); List<Integer> list3 = list.subList(j, list.size()); if (Math.abs(sum(list1) - sum(list2) - sum(list3)) == target) { // 当两组的差值等于target时,可以正确分组 return true; } } } return false; } // 计算总和 private static int sum(List<Integer> list) { int sum = 0; for (int i = 0; i < list.size(); i++) { sum += list.get(i); } return sum; } }
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html