英雄的力量

求所有子序列最大值的平方乘以最小值的和

1. 数学规律

首先可以发现顺序对结果没有影响,对原数组按升序进行排序,方便从小到大遍历枚举
由于数据量很大,一般只会遍历一次,所以要找数学规律
考虑遍历时的无后效性,前面数组遍历完后,必然会给后面留下一个值
可以通过这个值和当前遍历值计算出以当前值为结尾的所有序列数值

找规律
考虑abcd四个数
以d为结尾的子序列分别为abcd、acd、abd、ad、bcd、bd、cd
在计算数组值的时候,最大值都为d,最小值分别为a、b、c,贡献为4、2、1,记贡献值为s
可以推断出在abcde中,adcd对以e结尾的子序列的贡献为8/4/2/1,贡献值为2s+num[i-1]
这样就可以递推计算出所有的数组值

class Solution {
public:
    int sumOfPower(vector<int> &nums) {
        const int MOD = 1e9 + 7;
        sort(nums.begin(), nums.end());
        int ans = 0, s = 0;//初始为0
        for (long long x: nums) {
            ans = (ans + x * x % MOD * (x + s)) % MOD; // 中间模一次防止溢出
            s = (s * 2 + x) % MOD;
        }
        return ans;
    }
};

posted @ 2023-05-19 14:51  失控D大白兔  阅读(21)  评论(0编辑  收藏  举报