首页 > 试题广场 >

0-100的N个数(数的值范围为0~100 1 N =

[问答题]

0-100的N个数(数的值范围为0~100 1 < N <= 1000),分成两组A、B:怎样分|meanA-meanB|最大? 

对N个数排序(升序,降序都可以)
得到X1-XN
然后设参数从第m个位置划分这样就得到A=X1---Xm,B=Xm+1---XN
y =meanA-meanB = [(X1+..+Xm)/m] + [(Xm+1+..+XN)/(N-m)]
对上面式子以m求一阶导,同时考虑Xi>=0
所以有一阶导<=0,当且仅当N个数全为0时,才取到等号
所以这个函数是个递减函数,加上一个绝对值,这样最大值就应该在边界点处。所以取m=1 ,或者m=N-1,分别计算一下y,取绝对值较大值者
发表于 2019-07-31 22:39:10 回复(0)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner input=new Scanner(System.in);
        Random rand=new Random();
        int n=input.nextInt();
        
        int arr[]=new int[n];
        for(int i=0;i<n;i++)
            arr[i]=rand.nextInt(100);
        Arrays.sort(arr);
        int sum1=0,sum2=0;
        for(int num:arr)
            sum2+=num;
        
        int max=0,tmp,split=0;
        for(int i=0;i<n-1;i++){
            sum1+=arr[i];
            sum2-=arr[i];
            tmp=Math.abs(sum1/(i+1)-sum2/(n-1-i));
            if(tmp>max){
                max=tmp;
                split=i;
            }
        }
        
        ArrayList<Integer> mylist1=new ArrayList<Integer>();
        ArrayList<Integer> mylist2=new ArrayList<Integer>();
        for(int i=0;i<n;i++)
            if(i<split)
                mylist1.add(arr[i]);
            else
                mylist2.add(arr[i]);
        
        System.out.println(mylist1);
        System.out.println(mylist2);
        System.out.println(max);
    }
}
发表于 2019-04-29 21:25:25 回复(0)