数组切分——十三届蓝桥杯

试题 G: 数组切分

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分

【问题描述】 已知一个长度为 N 的数组:A1, A2, A3, ...AN 恰好是 1 ∼ N 的一个排列。现 在要求你将 A 数组切分成若干个 (最少一个,最多 N 个) 连续的子数组,并且 每个子数组中包含的整数恰好可以组成一段连续的自然数。 例如对于 A = {1, 3, 2, 4}, 一共有 5 种切分方法: {1}{3}{2}{4}:每个单独的数显然是 (长度为 1 的) 一段连续的自然数。 {1}{3, 2}{4}:{3, 2} 包含 2 到 3,是 一段连续的自然数,另外 {1} 和 {4} 显然 也是。 {1}{3, 2, 4}:{3, 2, 4} 包含 2 到 4,是 一段连续的自然数,另外 {1} 显然也是。 {1, 3, 2}{4}:{1, 3, 2} 包含 1 到 3,是 一段连续的自然数,另外 {4} 显然也是。 {1, 3, 2, 4}:只有一个子数组,包含 1 到 4,是 一段连续的自然数。

【输入格式】 第一行包含一个整数 N。第二行包含 N 个整数,代表 A 数组。

【输出格式】 输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007 取 模后的值

【样例输入】 4 1 3 2 4

【样例输出】 5

【评测用例规模与约定】 对于 30% 评测用例,1 ≤ N ≤ 20. 对于 100% 评测用例,1 ≤ N ≤ 10000.

 做题思想:

主要是判断每一段分割的数组是否是连续的,即判断该段数组的最大值减最小值是否等于该段数组的长度-1;

import java.util.Scanner;

public class G {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
       int[] arr=new int[100001];
        int sum=1;//每个单独的数为一种存法如{1}{3}{2}{4};
        for (int i=1;i<=n;i++){
           arr[i]=sc.nextInt();
        }
        for (int i=1;i<n;i++){
            for (int j=i+1;j<=n;j++){
                int []num=new int[j+1];//从i到j进行复制,num用于存放复制的数据
                for (int k=i;k<=j;k++){
                    num[k]=arr[k];
                }
                int max=num[i],min=num[i];//max与min分别为这些数中最大数和最小数
                for (int k=i;k<=j;k++){
                    if (min>num[k])min=num[k];
                    if (max<num[k])max=num[k];
                }
                if (max-min==j-i)sum++;
                //因为1到N整体是连续的数
                //以3 2 4为例:max为4,min为2; 4-2=2,j-i=2;如果最大数减最小数不等于长度-1,那么一定不连续。
            }
        }
        System.out.println(sum);
    }
}
谨以此文章纪念该题没有将类名改为Main。
写该文章只为抒情,因为目前还没有答案,所以并不保证做对。

猜你喜欢

转载自blog.csdn.net/weixin_52473454/article/details/124101510