1. 程式人生 > >1104 Sum of Number Segments

1104 Sum of Number Segments

style 包括 sca 乘積最大 兩個 tmp 自身 pri code

題意:

給出n個不大於1.0的小數序列,如{ 0.1, 0.2, 0.3, 0.4 },則共有10個分片(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) and (0.4)。現要求計算每個分片之和,即0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0.

思路:數學題,找規律

1、以0.1 0.2 0.3 0.4 0.5 為例 0.1總共會被加1個5次(1*5),即由0.1作為起點發起的,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總共會被加2個4次(2*4),即由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.2 0.3、0.2 0.3 0.4、0.2 0.3 0.4 0.5 以此類推,某個數被相加的次數等於其左側的個數(包括其自身)與其右側的個數(包括其自身)之積,如下表
a[i] 0.1 0.2 0.3 0.4 0.5
在a[i]左側的個數(包括a[i]本身) 1 2 3 4 5
在a[i]右側的個數(包括a[i]本身) 5 4 3 2 1
下標i 1 2 3 4 5
2、不註意細節會有兩個測試點通不過! 因為n的最大值為100,000,因此語句1整數部分乘積最大為50,000*50,000>2^31-1,從而會造成溢出!(細節!基礎!) 代碼:
#include <stdio.h>
int main()
{
    int n;
    double
sum=0,tmp; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf",&tmp); //sum+=tmp*(i*(n-i+1));//錯誤 語句1 sum+=tmp*i*(n-i+1);//正確 } printf("%.2f\n",sum); return 0; }

1104 Sum of Number Segments