lyh20021209 2022-01-16 11:37 采纳率: 76.9%
浏览 44
已结题

一道PAT 1049数列的片段和 运行超时

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

/**
统计数列中每个元素出现的次数,然后乘以这个数列元素,再求和。
那么对于求每个元素出现的次数这个问题,我们先假定由这么一个数列,我们从1到n依次为其元素建立索引值,例如第一个元素索引值就是1,最后一个就是n。使用数组来存储这个数列时,数组的索引值时会被-1的,所以要再加上1。
对于其中的任意一个元素,假设其索引值为i。发现若数列片段的首项的索引值超过i时,这个片段一定不会“囊括”该元素;同时发现,当数列片段的首项的索引值不超过i时(不妨假设为k,称之为次首项数列),所有的以k为首项的数列片段,一定都“囊括”了该元素,且“囊括”的次数由从该元素开始到数列尾项的个数决定,即(n-i+1)次(与首项索引值无关,称之为囊括次数)。那么该元素总共出现的次数就是这样所有的次首项数列的个数乘以囊括次数。那么该元素在片段和总和中造成的影响即为该元素值ai*(n-i+1)*i
*/
import java.util.Scanner;
import java.text.DecimalFormat;
public class Main{
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        double sum=0;
        double[] a=new double[n];
        DecimalFormat df=new DecimalFormat("0.00");
        for(int i=0;i<n;i++) a[i]=scan.nextDouble();
        for(int i=0;i<n;i++){
            sum+=a[i]*(i+1)*(n-i);
        }
        String str=df.format(sum);
        System.out.println(str);
    }
}
我原来的代码是三循环,超时了,但是这个为什么也会超时?不会超时的算法应该是什么?
  • 写回答

1条回答 默认 最新

  • yyfhz 2022-01-18 22:04
    关注

    确定是超时错误?会不会是别的问题?从解题的思路来看没啥毛病。难道是直接在第一个接收输入的地方就把结果算出来,这样可以省掉数组的空间分配,但就时间而论节约有限

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月5日
  • 创建了问题 1月16日

悬赏问题

  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败