“两两”求和问题技巧

问题描述:
输出所有数两两之间距离的总和。

思路:
由于是两两,所以对于每2个相邻点之间的区间,会被统计(左边点的个数*右边点的个数)次。
比如:对于序列 2, 7, 9, 16, 20, 23, 30 中的9-16这个区间,左边有3种情况,右边有4种情况,所以总的有3*4=12种情况,即有12个区间会包含有9-16这个区间。

示例代码:

注意这一行代码:result += count*(i+1)*(n-i-1);

public class Main{

    //快速判断一个数是不是质数:(总共2步)
    //1、判断能否被2整除
    //2、遍历 3~Math.sqrt(value)这个范围
    public static boolean IsPrime(int val){
        boolean flag = true;
        if((val & 1) == 0){
            flag = false;
            return flag;
        }
        for(int i=3; i<= Math.sqrt(val); i+=2){
            if(val%i == 0){
                flag = false;
                break;
            }
        }
        return flag;
    }


    public static long MyFunction(int n, int[] nums){

        long result = 0;
        for(int i=0; i<n-1; i++){
            int count = 0;

            for(int j=nums[i]+1; j<nums[i+1]; j+=2){
                if(IsPrime(j))
                    count++;
            }
            result += count*(i+1)*(n-i-1);
        }

        return result;      
    }

    public static void main(String[] args){

        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()){
            int n = in.nextInt();
            int[] nums = new int[n];
            for(int i=0; i<n; i++){
                nums[i] = in.nextInt();
            }

            long result = MyFunction(n, nums);
            System.out.println(result);

        }

    }
}

参考:
http://exercise.acmcoder.com/online/online_judge_list_all?konwledgeId=41

标签