光骓者的荣耀(洛谷P5638题题解,弃坑Java拥抱C++)

题目要求

P5638题目链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析

交了两版本优化的Java代码,全T了最后5个点。

第一版是用了前缀和来写的:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt(), radius = scanner.nextInt();
        long[] sum_array = new long[num];
        for (int i = 0; i < num-1; i++) {
            sum_array[i+1] = sum_array[i] + scanner.nextLong();
        }
        scanner.close();
        long count = sum_array[radius];
        for(int i = 1; i < num-radius; i++) {
            count = Math.max(count, (sum_array[i+radius]-sum_array[i]));
        }
        System.out.println(sum_array[num-1]-count);
    }
}

在这里插入图片描述

第二个版本用了DP来写的(参考了大佬的讲解):

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt(), radius = scanner.nextInt();
//        long[] sum_array = new long[num];
//        for (int i = 0; i < num-1; i++) {
//            sum_array[i+1] = sum_array[i] + scanner.nextLong();
//        }
//        scanner.close();
//        long count = sum_array[radius];
//        for(int i = 1; i < num-radius; i++) {
//            count = Math.max(count, (sum_array[i+radius]-sum_array[i]));
//        }
//        System.out.println(sum_array[num-1]-count);
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt(), radius = scanner.nextInt();
        long[][] dp = new long[num+1][2];
        long[] array = new long[num];
        for (int i = 1; i < num; i++) {
            array[i] = scanner.nextLong();
        }
        scanner.close();
        for(int i = 2; i <= num;i++) {
            dp[i][0] = dp[i-1][0] + array[i-1];
            if(i > radius) {
                dp[i][1] = dp[i-radius][0];
            }
            dp[i][1] = Math.min(dp[i-1][1]+array[i-1], dp[i][1]);//状态转移方程
        }
        System.out.println(dp[num][1]);
    }
}

在这里插入图片描述

AC代码(C++语言描述)

#include<bits/stdc++.h>
using namespace std;
long long sum_array[1000001];
long long num, radius;

int main() {
    cin >> num >> radius;
    for(int i = 0; i < num-1; i++) {
        long long x;
        cin>>x;
        sum_array[i+1] = sum_array[i] + x;
    }
    long long count = sum_array[radius];
    for(int i = 1; i < num - radius; i++) {
        count=max(count, sum_array[i + radius] - sum_array[i]);
    }
    cout << sum_array[num-1]-count << endl;
    return 0;
}
发布了477 篇原创文章 · 获赞 970 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104240545