AtCoder Beginner Contest 353 C - Sigma Problem

题目解读: 输入n项正整数,将其中的项两两相加并%10的八次方,再将结果进行求和输出。

初步尝试暴力模拟:

初步运行后可通过样例,但提交后发现超时,即时间复杂度太高,因此对暴力模拟的时间复杂度分析:为O(n*n);

因此思考如何对时间复杂度进行简化:

  题干中要求让输入的每项两两相加,在不考虑取余条件的情况下即将(输入的每一项)*(输入的项数n-1),然后再考虑取余,即需要判断两两相加是否大于10000000。所以在不考虑取余的情况下,求和的任务再输入的时候就可以一起完成,时间复杂度为O(n),这是如果用低时间复杂度的方法求得需要减去几个100000000,便可以减少时间复杂度。

  方法:

  在如前面所说将(输入的每一项)*(输入的项数n-1)后,将数组内的项进行排序,对其中的每一项进行遍历,上图中的lower_bound(a,a+n,100000000-a[i])-a是返回数组a中第一个大于100000000-a[i]的项的坐标,即与a[i]相加大于100000000,需要取余的项的坐标,而坐标大于的j的项则都需要进行取余,但在遍历过程中会出现j<i+1的情况,这时是重复判断了之前已经判断过需要取余的项,这时只需要将i+1作为j的坐标,即可避免重复。

  通过上述方法就可以快速得到需要取余100000000的数量,只需在原本已经求的和上减去这些10的八次方即可,减少了时间复杂度,能够满足题目的要求。

  完整代码如下:

通过上述的解题过程可以获取一些经验,我们在遇到时间复杂度过大导致无法解出的情况时,可以尝试找出具体是哪一部分在导致时间复杂度过大,将那一部分单独拿出,来思考是否有更好的方法来简化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值