CSP 202109-2 非零段划分

题目链接:

计算机软件能力认证考试系统icon-default.png?t=M276http://118.190.20.162/view.page?gpid=T130

【分析】其实这道题是一个差分+前缀和的问题,我们可以这么想,每当出现一个数比前一个数大时,例如数组为[2, 4]时,说明在这个区间内可以产生一次划分,然后对于[5, 8]又可以产生一个划分,相当于对原数组[0, 1, 2, 3, 4, 5, 6, 7, 8]中的区间[2, 4], [5, 8] + 1,最后算一下前缀和,也就是能产生交集的数量就是通过这个数能够产生的划分了。

先贴一个暴力能拿70分再说

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        int i, ans = 0;
        HashSet<Integer> set =new HashSet<>();
        int start = 100001, end = -1;
        for(i = 0; i < n; i++){
            arr[i] = scanner.nextInt();
            set.add(arr[i]);
            set.add(arr[i]);
        }
        int pre = 0;
        int j, a, max;
        for(Integer it: set){
            if(it == 0) continue;
            max = 0;
            pre = 0;
            for(i = 0; i < n; i++){
                if(arr[i] < it && pre == 1) {
                    max++;
                    pre = 0;
                }else if(arr[i] >= it){
                    pre = 1;
                }
            }
            if(pre == 1) max++;
            ans = Math.max(ans, max);
        }
        System.out.println(ans);
    }

}

 差分+前缀和

 

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] cnt = new int[10002];
        int[] arr = new int[500002];
        int i;
        for(i = 1; i <= n; i++){
            arr[i] = scanner.nextInt();
            if(arr[i] > arr[i - 1]){
                cnt[arr[i - 1] + 1]++;
                cnt[arr[i] + 1]--;
            }
        }
        int ans = cnt[0];
        for(i = 1; i < 10002; i++){
            cnt[i] += cnt[i - 1];
            ans = Math.max(ans, cnt[i]);
        }
        System.out.println(ans);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值