WUSTOJ 1349: TLE(Java)算法优化

108 篇文章 0 订阅
80 篇文章 18 订阅

题目链接:1349: TLE

Description

WH在刷题时,设计出了如下代码:

#include<stdio.h>
int main()
{
    int i, j, cnt, k, N, K, a[5555];
    scanf("%d%d", &N, &K);
    int ans = 0;
    for (i = 1; i <= N; i++)
    {
    	scanf("%d", &a[i]);					// 输入N个数
    }
    for (i = 1; i <= N; i++)
    {
    	for (j = i + 1; j <= N; j++)
    	{
			cnt = 0;
			for (k = i; k <= j; k++)		// 计算区间[i,j]的数的和
			{
				cnt += a[k];
			}
			if (cnt % K == 0)				// 和是K的整数倍
			{
				ans++;						// 结果加1
			}
    	}
    }
    printf("%d\n", ans);
}

上面的代码据说可能会TLE(不管你信不信,反正我是信了,不信你复制粘贴上去看看?)你的任务是重新设计一个更高效的程序帮助WH计算出ans的值

Input

第一行2个整数N K(N <= 5000,K > 0)

第二行N个数a[i]: 第i个数为a[i](0 <= a[i] <= 10000)

Output

输出ans的值

Sample Input

5 1
1 2 3 4 5
5 2
5 4 2 1 3

Sample Output

10
5

分析?

上述代码:计算N个数中,和是K的倍数的区间的个数。

数组sum下标从0开始,以第二组数据为例,sum如下:
第一次循环后:

j01234
sum[j]5

ans = 0
第二次循环后:

j01234
sum[j]94

ans = 0
第三次循环后:

j01234
sum[j]1162

ans = 1
第四次循环后:

j01234
sum[j]12731

ans = 2
第五次循环后:

j01234
sum[j]1510643

ans = 5

代码?

/**
 * Time 495ms
 * @author wowpH
 * @version 1.1
 * @date 2019年7月5日下午12:53:35
 * Environment:	Windows 10
 * IDE Version:	Eclipse 2019-3
 * JDK Version:	JDK1.8.0_112
 */

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		int[] sum = new int[5000];					// 保存区间的和
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int N = sc.nextInt();
			int K = sc.nextInt();
			int ans = 0;
			for (int i = 0; i < N; ++i) {
				sum[i] = sc.nextInt();
				for (int j = i - 1; j >= 0; --j) {	// 更新前面的和
					sum[j] = sum[j] + sum[i];
					if (0 == sum[j] % K) {			// 是K的整数倍
						ans = ans + 1;				// 结果加1
					}
				}
			}
			System.out.println(ans);
		}
		sc.close();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值