力扣第 104 场双周赛 2681. 英雄的力量
原题链接力扣
题目大意:我开始看成连续子段了,写了个递归程序.......
一个数组任选一个子序列,子序列的力量值=最大值平方*最小值。求所有子序列的力量和。
分析过程:如序列长度为n,子序列总数为2的n次幂,显然不可能枚举所有子序列来求解。那么只能锁定子序列最大值和最小值来处理。容易想到先排序,排序后的序列可以取任意ai和aj,那么ai最小值,aj 最大值,i和j之间的元素可以任取,例如i=2,j=6,那么i和j之间有3个其他元素,这3个元素可以任取,因此共有2的3次幂共8种选取方法:(a2,a6) (a2,a3,a6) (a2,a4,a6) (a2,a5,a6)(a2,a3,a4,a6).......。枚举所有i和j,时间复杂度为O(n2)。
这类问题如何继续降低复杂度。一般来说都会存在某种规律,使得下一次的处理能利用上一次的结果,也有写问题存在某种(数学)方法,能直接求得解。本题目通过找规律解决。
假设a1为最小值,那么子序列中必然有a1,此时如果锁定ai为最大值,那么所有满足(a1最小,ai最大)的子序列数量必然ai*ai*a1*pow(2,i-2)。
枚举下最大最小值分别为(i,j)的公式
最大值j\最小值i | a1 | a2 | a3 | ...... | 总和 |
a2 | a1*a2*a2 |
(a1)*a2*a2 |
|||
a3 | 2a1*a3*a3 | a2*a3*a3 |
(2a1+a2)*a3*a3 |
||
a4 | 4a1*a4*a4 | 2a2*a4*a4 | (4a1+2a2+a3)*a4*a4 | ||
a5 | 8a1*a5*a5 | 4a2*a5*a5 | 2a3*a5*a5 | ...... | (8a1+4a2+2a3+a4)*a5*a5 |
a6 | 16a1*a6*a6 | 8a2*a6*a6 | 4a3*a6*a6 | ...... | |
可以发现规律为当ai为最大值时,其组成所有子序列的力量和为Y[i]*a[i]*a[i],而这个Y[i]可以由Y[i-1]*2+a[i-1]求得。
class Solution {
public:int sumOfPower(vector<int>& nums) {int i,j,r=nums.size()-1,mod=1e9+7;;sort(nums.begin(),nums.end());/**< 排序 */long long ans=0,sum=nums[0];for(i=0;i<=r;i++)/**< 就一个元素序列单独处理 */ans=(ans+1LL*nums[i]*nums[i]%mod*nums[i])%mod;for(i=1;i<=r;i++)/**< 最大值为i的力量和 */{long long temp=1LL*nums[i]*nums[i]%mod;ans=(ans+temp*sum%mod)%mod;sum=(sum*2+nums[i])%mod;/**< i+1的系数 */}return (int)ans;}
};
两个循环综合在一起的写法。
class Solution {
public:int sumOfPower(vector<int>& nums) {int i,j,r=nums.size()-1,mod=1e9+7;;sort(nums.begin(),nums.end());/**< 排序 */long long ans=0,sum=0;for(i=0;i<=r;i++)/**< 最大值为i的力量和 */{long long temp=1LL*nums[i]*nums[i]%mod;ans=(ans+temp*(sum+nums[i])%mod)%mod;sum=(sum*2+nums[i])%mod;/**< i+1的系数 */}return (int)ans;}
};
力扣第 104 场双周赛 2681. 英雄的力量相关推荐
- 20220219:力扣第72场双周赛题解
力扣第72场双周赛 题目 思路与算法 代码实现 写在最后 题目 统计数组中相等且可以被整除的数对 找到和为给定整数的三个连续整数 拆分成最多数目的偶整数之和 统计数组中好三元组数目 思路与算法 前三题 ...
- 20210530:力扣第53场双周赛题解
力扣第53场双周赛题解 题目 思路与算法 代码实现 写在最后 题目 长度为三且各字符不同的子字符串 数组中最大数对和的最小值 矩阵中最大的三个菱形和 思路与算法 长度为三且各字符不同的子字符串:遍历查 ...
- 20201023:力扣第37场双周赛(上)
力扣第37场双周赛(上) 题目 思路与算法 代码实现 写在最后 题目 删除某些元素后的数组均值 网络信号最好的坐标 思路与算法 第二题直接暴力就可以了,计算每个点的所有偏移量存入list,即以(0,0 ...
- 以赛促练-力扣第85场双周赛以及第307场周赛
文章目录 第85场双周赛 T3.字母移位II T4.删除操作后的最大子段和 第307场周赛 T2.最大回文数字 T3.感染二叉树需要的总时间 T4.找出数组的第K大和 第85场双周赛 T1直接暴力枚举 ...
- 力扣 第 87 场双周赛 ---心态爆炸场
第 87 场双周赛 T1 - 模拟 class Solution {public:int q[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, ...
- 力扣第 107 场双周赛
因为打abc打(。・∀・)ノ゙嗨了,忘记cf是10.05了,所以只能去力扣了 A.直接模拟,然后把用过的点记录下次别用就行 class Solution:def maximumNumberOfStri ...
- 20211201:力扣第268周双周赛(上)
力扣第268周双周赛(上) 题目 思路与算法 代码实现 写在最后 题目 两栋颜色不同且距离最远的房子 给植物浇水 思路与算法 双指针遍历即可,维护那个索引最大差值即可. 模拟题,正常情况需要每次走一步 ...
- 20210119:力扣第42周双周赛(下)
力扣第42周双周赛(下) 题目 思路与算法 代码实现 写在最后 题目 修改后的最大二进制字符串 得到连续 K 个 1 的最少相邻交换次数 思路与算法 修改后的最大二进制字符串 这道题的思路很简单,交换 ...
- 20210101:力扣第42周双周赛(上)
力扣第42周双周赛(上) 题目 思路与算法 代码实现 写在最后 题目 无法吃午餐的学生数量 平均等待时间 思路与算法 无法吃午餐的学生数量 本题直接暴力模拟也没问题,但是这应该不是题目的本意,我们可以 ...
最新文章
- 通过Nginx,Tomcat访问日志(access log)记录请求耗时
- 电脑计算机无法找到脚本文件夹,我的电脑开机为什么出现无法找到脚本呢?
- 深度学习核心技术精讲100篇(六十三)-【CNN】一文详细讲解前因后果
- 【技术综述】人脸风格化核心技术与数据集总结
- Match Points
- MySQL--Delete语句别名+LIMIT
- .NET 和 Mono 的一点历史
- Asp.Net中WebForm与MVC,Web API模式对比
- Q124:PBRT-V3,“路径追踪”积分器(14.5章节)
- 最新版酒店小程序源码
- ExtJs 入门教程
- Win10 系统通过易升升级后,系统盘空间不足解决办法(个人经历)
- 陕西师大计算机考研专业考408嘛,2021考研计算机408考试趋势分析
- 实用前端可视化工具库
- vue图片压缩不失真_vue中实现图片压缩 file文件的方法
- 利用AFD进行播出级的自动幅型比控制
- ThingJS 开发使用感悟
- CornerStone的使用
- linux shell写cgi,shell写cgi脚本
- 面试 | 3.5 万字总结 Java 后台研发常见面试题