最小元素

时间:2018-01-07 12:54:10

标签: arrays algorithm

您将获得一个数组A []。您需要将此数组划分为恰好K个非空段,并检查所有段中最大元素中的最小元素S是否小于Q. 换句话说,如果我们将每个段的最大元素存储在数组P []中,那么你必须检查P []中的最小元素是否小于Q.

输入:

第一行输入包含多个测试用例,T 每个测试用例的第一行包含三个整数: N表示数组A []中的元素数,K表示段数和Q. 每个测试用例的第二行包含 N个以空格分隔的整数,A1,A2,...... An。

输出: 对于每个测试用例,如果S小于Q,则打印S,否则打印"否" (没有引号)。 每个测试用例的答案应该换个新的一行。

约束:

  • 1≤T≤10
  • 1≤N≤10^ 5
  • 1≤K≤N
  • 0≤Q≤10^ 9
  • 1≤A[i]≤10^ 9

这是我的解决方案: 在分析时,我认为如果我们将数组的最小元素保持在大小为1的段中,那么所有段的最大值的最小值将是该数组的最小元素。这样做,我们只需要比较最小元素和Q,以打印所需的输出。

public static void main(String[] args)
{
    Scanner s=new Scanner(System.in);
    int t = s.nextInt();
    int n, k, q, i, min;
    while (t-- > 0)
    {
    n = s.nextInt();
    k = s.nextInt();
    q = s.nextInt();
    int[] a = new int[n];
    for(i = 0; i < n; i++) 
        a[i] = s.nextInt();
    min = 0;
    for(i = 1; i < n; i++) {
        if(a[i] < a[min]) {
            min = i;
        }
    }
    if(a[min] < q) 
    System.out.println(a[min]);
    else
    System.out.println("NO");
    }
}

此解决方案满足除一个以外的所有测试用例,并且是隐藏的。任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

我知道,Hackerearth的Capillary Software Hackathon已经提出了这个问题。

嗯,这个问题含糊不清。没有明确的“k”定义,也应该是均匀溢出或随机等等

此代码传递了一个您无法通过的案例,但在所有其他情况下都失败了:

t = int(raw_input())

for _ in range(t):
    n,k,q = map(int,raw_input().split())
    arr = map(int,raw_input().split())

qt = n/k
arr_new = []

for i in range(k):
    max_num = max(arr[i*qt : (i+1)*qt])
    arr_new.append(max_num)

min_num = min(arr_new)

if(min_num < q):
    print min_num
else:
    print "NO"

答案 1 :(得分:-1)

问题清楚地表明“你需要将这个数组划分为恰好K个非空段,并检查所有段中最大元素中的最小元素S是否小于Q.”

在评论中指出,你的程序中根本没有使用“k”。

例:
n = 6
A [] = [17,3,2,5,8,19]
k = 3
Q = 7

根据你的代码,由于min元素是2,输出将是2(2 <7)。但是,问题要求你首先将数组分成k个相等的部分(在这种情况下为3),然后在最大的段中找到最小值,然后将它与Q进行比较。 因此,如果我们将数组A []分成3个段{17,3},{2,5},{8,19},我们看到所有max的min元素是5.因为,5&lt; 7,输出为5。

这是基于我从问题中理解的内容。然而,基于'k'的分段应该是如何进行的还不是很清楚。我假设了一个顺序分段。