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

来源:互联网 发布:b2b平台排名数据 编辑:程序博客网 时间:2024/06/15 21:51


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

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


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

如下 :


如{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;}  

提交代码



原创粉丝点击