hdu 5247 找连续数 (java)

    xiaoxiao2021-12-14  17

    Problem Description

    小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的。

    现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间。

    Input

    输入包含一组测试数据。 第一行包含两个整数n,m,n代表数组中有多少个数字,m 代表针对于此数组的询问次数,n不会超过10的4次方,m 不会超过1000。第二行包含n个正整数,第 I 个数字代表无序数组的第 I 位上的数字,数字大小不会超过2的31次方。接下来 m 行,每行一个正整数 k,含义详见题目描述,k 的大小不会超过1000。

    Output

    第一行输"Case #i:"。(由于只有一组样例,只输出”Case #1:”即可) 然后对于每个询问的 k,输出一行包含一个整数,代表数组中满足条件的 k 的大小的区间的数量。

    Sample Input

    6 2 3 2 1 4 3 5 3 4 Sample Output Case #1: 2 2

    附上AC代码:

    import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int index = 0; while (in.hasNext()) { int n = in.nextInt(); int m = in.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = in.nextInt(); } int[] ans = new int[1005]; ans[1] = n; for (int i = 0; i < n - 1; i++) { int max = nums[i]; int min = nums[i]; int[] flag = new int[100010]; flag[nums[i]] = 1; for (int j = i + 1; j < n; j++) { if(flag[nums[j]] == 1) { break; } max = Math.max(max, nums[j]); min = Math.min(min, nums[j]); if (j - i + 1 > 1000) { break; } if (max - min > 1000) { break; } if (max - min == j - i) { ans[j - i + 1]++; } flag[nums[j]] = 1; } } System.out.println(String.format("Case #%s:", ++index)); for (int i = 0; i < m; i++) { int k = in.nextInt(); System.out.println(ans[k]); } } } }

    转载请注明原文地址: https://ju.6miu.com/read-965334.html

    最新回复(0)