天天看點

PAT甲級1104

1104. Sum of Number Segments (20)

時間限制

200 ms

記憶體限制

65536 kB

代碼長度限制

16000 B

判題程式

Standard

作者

CAO, Peng

Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For example, given the sequence {0.1, 0.2, 0.3, 0.4}, we have 10 segments: (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).

Now given a sequence, you are supposed to find the sum of all the numbers in all the segments. For the previous example, the sum of all the 10 segments is 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N, the size of the sequence which is no more than 105. The next line contains N positive numbers in the sequence, each no more than 1.0, separated by a space.

Output Specification:

For each test case, print in one line the sum of all the numbers in all the segments, accurate up to 2 decimal places.

Sample Input:

4

0.1 0.2 0.3 0.4

Sample Output:

5.00

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
/*
double sum1(vector<double>a, int i, int j)
{
  vector<double> v;
  for (int k = i; k <= j; k++)
  {
    if(k==i)
    v.push_back(a[k]);
    else
    {
      v.push_back(a[k]+v[k-i-1]);
    }
  }
  double sum = 0.0;
  for (int i = 0; i < v.size(); i++)
  {
    sum += v[i];
  }
  return sum;
}*/
int main()
{
  int N;
  cin >> N;
  double t;
  int n = N;
  vector<double> v;
  while (N--)
  {
    cin >> t;
    v.push_back(t);
  }
  //sort(v.begin(), v.end(),cmp);不是排序
  //reverse(v.begin(), v.end());
  double sum = 0;
  /*for (int i = 0; i < v.size(); i++)
  {
    sum += sum1(v, i, v.size() - 1);
  }*/
  /*vector<double> vv;
  for (int i = 0; i < v.size(); i++)
  {
    if (i == 0)
    {
      vv.push_back(v[i]);
    }
    else
      vv.push_back(v[i] * (i+1) + vv[i - 1]);估計有精度損失,其實這個跟下面的思路一樣
  }*/
  for (int i = 0; i < v.size(); i++)
  {
    sum += v[i]*(n-i)*(i+1);//找出元素出現的規律即可
  }
  printf("%.2f", sum);
  return 0;
}      

繼續閱讀