当前位置: 代码迷 >> 综合 >> PAT 乙级 1049 数列的片段和(JAVA)
  详细解决方案

PAT 乙级 1049 数列的片段和(JAVA)

热度:70   发布时间:2023-11-24 15:45:11.0

给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列 { 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) 这 10 个片段。

给定正整数数列,求出全部片段包含的所有的数之和。如本例中 10 个片段总和是 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

输入格式:
输入第一行给出一个不超过 105的正整数 N,表示数列中数的个数,第二行给出 N 个不超过 1.0 的正数,是数列中的数,其间以空格分隔。

输出格式:
在一行中输出该序列所有片段包含的数之和,精确到小数点后 2 位。

输入样例:
4
0.1 0.2 0.3 0.4
输出样例:
5.00
我的思路:这题可以直接遍历计算,但是JAVA一定超时。把所有情况写出来,可以发现本题实质上可以理解为求出每个数字出现的个数,乘上对应数字,最后加起来就可以了

我们以给的用例作为例子:
在这里插入图片描述
对应的次数为
在这里插入图片描述
总次数为 4*1+3*2+2*3+1*4
总大小为 4*1*0.1+3*2*0.2+2*3*0.3+1*4*0.4=5.0
规律很清楚 即 sum=sum+(N-i)*(i+1)*value

画个图就看出来了。即便如此,JAVA依然超时,后改用BufferedReader 还是超时,最后祭出StreamTokenizer 终于过了。PAT对于JAVA还是很不友好。**

import java.util.*;
import java.io.*;
public class Main{
      public static void main(String[]args)throws IOException{
      BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));StreamTokenizer st=new StreamTokenizer(bf);st.nextToken();int N=(int)st.nval;double sum=0;for(int i=0;i<N;++i){
      st.nextToken();sum+=((double)st.nval)*(N-i)*(i+1);} System.out.printf("%.02f",sum);       }
}

至于StreamTokenzier的用法,网上有很多介绍,可以去搜搜看。(但我觉得这个并不好用)
如果您有更好更方便的方法,麻烦评论一下。我是菜鸟一个,希望得到进步。

  相关解决方案