题解 | #数组分组#
数组分组
https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String a;
char[] charAy;
int[] number, grouped;
int i = 0, l, n = 0, sum1 = 0, sum2 = 0, cnt = 0;
try {
a = in.readLine();
l = a.length();
charAy = new char[l];
a.getChars(0, l, charAy, 0);
while (i < l) {
n *= 10;
n += charAy[i] - '0';
i++;
}
number = new int[n];
grouped = new int[n];
a = in.readLine();
parse(a, number);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
i = 0;
while (i < n) {
if (number[i] % 5 == 0) {
sum1 += number[i];
} else if (number[i] % 3 == 0) {
sum2 += number[i];
} else {
grouped[cnt++] = number[i];
}
i++;
}
//将第一个数组和第二个数组的差值作为是否可分组的依据
//1:a+b+c+d=sum 令a-b=k 如果c-d=k 则两式相减a-b-(c-d)=0
//得2:a-b-c+d=0 联立1式可得2a+2d=sum 所以a+d=sum/2 b+c=sum/2
//a,d分为一组,b,c分为一组
//sum1相当于a,sum2相当于b,sum1-sum2相当于k,
//现只要求剩余的grouped数组中的数能分成+(g1+g2+..)-(g3+g4+..)=k的型式,即可以分组
if (group(grouped, cnt, 0, sum1 - sum2))
System.out.print(true);
else
System.out.print(false);
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void parse(String a, int[] number) {
int i = 0, j = 0, l = a.length(), t = 0;
char[] charAy = new char[l];
boolean negative = false;
a.getChars(0, l, charAy, 0);
while (i < l) {
if (charAy[i] == ' ') {
if (negative)
t = -t;
number[j++] = t;
t = 0;
negative = false;
} else if (charAy[i] == '-') {
negative = true;
} else {
t *= 10;
t += charAy[i] - '0';
if (i == l - 1) {
if (negative)
t = -t;
number[j++] = t;
}
}
i++;
}
}
/**
*
* @param grouped
* @param cnt
* @param div
* @param div0
* @return
*/
public static boolean group(int[] grouped, int cnt, int div, int k) {
boolean groupable = false;
if (cnt == 0) {
groupable = div == k;
} else {
groupable = group(grouped, cnt - 1, div + grouped[cnt - 1], k);
groupable = groupable
|| group(grouped, cnt - 1, div - grouped[cnt - 1], k);
}
return groupable;
}
}
查看3道真题和解析