7-18 人以群分 (25 分)
社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。
输入格式:
输入第一行给出一个正整数N(2≤N≤105)。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过231。
输出格式:
按下列格式输出:
Outgoing #: N1
Introverted #: N2
Diff = N3
其中N1
是外向型人的个数;N2
是内向型人的个数;N3
是两群人总活跃度之差的绝对值。
输入样例1:
10
23 8 10 99 46 2333 46 1 666 555
输出样例1:
Outgoing #: 5
Introverted #: 5
Diff = 3611
输入样例2:
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85
输出样例2:
Outgoing #: 7
Introverted #: 6
Diff = 9359
思路与反思:此题拿到,一开始不知道咋办,没理解题目意思,后来才发现是保证最大的拉锯度规模和最大的活跃度的差值。有三种情况:
首先第一:一开始都是偶数的,一半一半,前半部分和后半部分的差值。这个是最简单的一种情况
第二:一开始是奇数,那就是分为两种情况,拿13举例,前六个和后七个做差值,然后前七个和后六个做差值,然后对比这两个差值那个更大,然后根据更大输出到底是前六个还是前七个更好。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(sr.readLine());//多少个人
String s[] = sr.readLine().split(" ");//获取数组
int people[] = new int [a];
for(int i=0;i<a;i++) {
people[i] = Integer.parseInt(s[i]);
}
Arrays.sort(people); //对活跃度进行排序
int sum = 0;
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
if(a%2==0) {
for(int i=0;i<a;i++) {
if(i<a/2) {
sum=sum+people[i];
}else {
sum1 = sum1+people[i];
}
}
System.out.println("Outgoing #: "+a/2);
System.out.println("Introverted #: "+a/2);
System.out.println("Diff = "+(sum1-sum));
}
if(a%2!=0) {
for(int i=0;i<a;i++) {
if(i<a/2) {
sum=sum+people[i];
}else {
sum1 = sum1+people[i];
}
}
for(int i=0;i<a;i++) {
if(i<a/2+1) {
sum2=sum2+people[i];
}else {
sum3 = sum3+people[i];
}
}
if((sum1-sum)>(sum3-sum2)) {
System.out.println("Outgoing #: "+(a/2+1));
System.out.println("Introverted #: "+a/2);
System.out.println("Diff = "+(sum1-sum));
}else {
System.out.println("Outgoing #: "+a/2);
System.out.println("Introverted #: "+((a/2)+1));
System.out.println("Diff = "+(sum3-sum2));
}
}
}
}
第二种方法还是依旧超时,只是提高了输入的速度:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(sr.readLine());//多少个人
String s[] = sr.readLine().split(" ");//获取数组
int people[] = new int [a];
for(int i=0;i<a;i++) {
people[i] = Integer.parseInt(s[i]);
}
Arrays.sort(people); //对活跃度进行排序
int sum = 0;
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
if(a%2==0) { //当输入的人数为偶数时候//一半一半
for(int i=0;i<a/2;i++) {
sum=sum+people[i]; //前半
sum1 = sum1+people[a-i-1];//后半
}
System.out.println("Outgoing #: "+a/2);
System.out.println("Introverted #: "+a/2);
System.out.println("Diff = "+(sum1-sum));
}
if(a%2!=0) {
for(int i=0;i<a/2;i++) {
sum=sum+people[i];
sum1 = sum1+people[a-i-1];
}sum1=sum1+people[a/2];
for(int i=0;i<a/2;i++) {
sum2=sum2+people[i];
sum3 = sum3+people[i];
}sum2=sum2+people[a/2];
if((sum1-sum)>(sum3-sum2)) {
System.out.println("Outgoing #: "+(a/2+1));
System.out.println("Introverted #: "+a/2);
System.out.println("Diff = "+(sum1-sum));
}else {
System.out.println("Outgoing #: "+a/2);
System.out.println("Introverted #: "+((a/2)+1));
System.out.println("Diff = "+(sum3-sum2));
}
}
}
}