pat 乙级 1049. 数列的片段和(20)


思路:  求各个数列的片段的和  相当于 求出  每个 数出现的次数 然后全部相加 即可 。

这里 如果 用双重循环 遍历 肯定炸 超时一定的。


这里 类似与 数学的找规律 :可以发现 每个数出现的次数 是有一定规律的,

如下 :


如{0.1, 0.2, 0.3, 0.4,0.5}


(0.1)  (0.1, 0.2)  (0.1, 0.2, 0.3)  (0.1, 0.2, 0.3, 0.4)  (0.1, 0.2, 0.3, 0.4,0.5) 
(0.2)  (0.2, 0.3)  (0.2, 0.3, 0.4)  (0.2, 0.3, 0.4, 0.5) 
(0.3)  (0.3, 0.4)  (0.3, 0.4, 0.5) 
(0.4)  (0.4, 0.5) 
(0.5)


0.1   5    =  5  *  1        5-0   *  0+1         N=5 
0.2   8    =  4  *  2        5-1   *  1+1         
0.3   9    =  3  *  3        5-2   *  2+1         // (N - i)*(i + 1);  
0.4   8    =  2  *  4        5-3   *  3+1
0.5   5    =  1  *  5        5-4   *  4+1




如{0.1, 0.2, 0.3, 0.4}


(0.1)  (0.1, 0.2)  (0.1, 0.2, 0.3)  (0.1, 0.2, 0.3, 0.4) 
(0.2)  (0.2, 0.3)  (0.2, 0.3, 0.4) 
(0.3)  (0.3, 0.4) 
(0.4) 


0.1   4  =  4  *  1        4-0   *  0+1        N=4
0.2   6  =  3  *  2        4-1   *  1+1        // (N - i)*(i + 1);  
0.3   6  =  2  *  3        4-2   *  2+1
0.4   4  =  1  *  4        4-3   *  3+1

......

...

所以 每个数出现的次数 就是 (N-i)*(i+1)



还有一种思路 就是 判断 i 会出现在哪些子区间里面
比如 1---------i--------n
i 的 左端点 在1-i 
i 的 右端点在 i-n 
所以 i 的可选情况 有 (i+1) (n-i)


还有第三种思路 :后期补 



这里给出 前两种思路的 代码实现: 


#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>

using namespace std;
double num[100005];
int main() 
{
    int N;
    cin>>N;
   	for (int i = 0; i < N; ++i)
   	{
   		cin>>num[i];
   	}

   	double sum=0.0;
   	for (int i = 0; i < N; ++i)
   	{
   		sum += (N - i)*num[i]*(i + 1);
   	}
   	printf("%.2lf\n",sum);
    return 0;
}
  

提交代码



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值