蓝桥杯_求和 java

问题描述

给定 n 个整数 a1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:

S=a1a2+a1a3+⋯+a1an+a2a3+⋯+an−2an−1+an−2an+an−1an

输入格式

输入的第一行包含一个整数 n

第二行包含 n 个整数 1,2,⋯,a1,a2,⋯,an

输出格式

输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。

样例输入

41 369

样例输出

117

评测用例规模与约定

对于 30%30% 的数据,1≤n≤1000,1≤ai≤100 。

对于所有评测用例, 1≤n≤200000,1≤ai≤1000 。

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 512M

思路:

//假如有5个数:a0,a1,a2,a3,a4
//求解:
// sum0 = a0 + a1 + a2 + a3 + a4
// 用乘法分配律进行分组求和
// sum1 = ( a1 + a2 + a3 + a4 ) * a0 = (sum0 - a0 ) * a0
// sum2 = ( a2 + a3 + a4 ) * a1 = (sum0 - a0 - a1 ) * a1
// sum3 = ( a3 + a4 ) * a2 = (sum0 - a0 - a1 - a2 ) * a2
// sum4 = ( a4 ) * a3 = (sum0 - a0 - a1 - a2 - a3 ) * a3
// res = sum1 + sum2 + sum3 + sum4

代码:

暴力(只有百分之60的分):
import java.util.Scanner;

public class 求和 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr= new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextInt();
        }
        long sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                long temp = arr[i] * arr[j];
                sum += temp;
            }
        }
        System.out.println(sum);
    }
}
差分数组(只有百分之90的分):
import java.util.Scanner;

public class 求和 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr= new int[n];
        long sum = 0l;
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextInt();
            sum += arr[i];
        }
        long res = 0l;
        for (int i = 0; i < arr.length; i++) {
            sum = sum - arr[i];
            res += sum * arr[i];
        }
        System.out.println(res);
    }
}
前缀和(AC代码):
import java.util.Scanner;

public class 求和 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr= new int[n];
        int[] copy = new int[n];
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextInt();
            sum += arr[i];
            copy[i] = sum;
        }
        long sum2 = 0l;
        long a = 0l;
        for (int i = 0; i < arr.length - 1; i++) {
            a = arr[i] * (sum - copy[i]);
            sum2 += a;
        }
        System.out.println(sum2);
    }
}
利用数学完全平方公式(AC代码):

公式:

import java.util.Scanner;

public class 求和 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr= new int[n];
        long sum = 0l;
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextInt();
            sum += arr[i];
        }
        long res = sum * sum;
        for (int i = 0; i < arr.length; i++) {
            res -= arr[i] * arr[i];
        }
        System.out.println(res/2);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值