用java实现人以群分

7-18 人以群分 (25 分)

社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。

输入格式:

输入第一行给出一个正整数N(2≤N≤10​5​​)。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过2​31​​。

输出格式:

按下列格式输出:

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));
            }
        }        
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41479464/article/details/88376474