Programming Challenge #5

A Discrete Mathematics professor has a class of N students. Frustrated with their lack of discipline, he decides to cancel class if fewer than K students are present when class starts.

Given the arrival time of each student, determine if the class is canceled.


Input

First take in T, the number of cases.

For each case, there will be two lines of input. The first line has N, the number of students in the class, followed by a space and then. K the number of students needed to be present when class starts.

The second line of each case is N space-separated integers, representing the arrival time of each student. Non-positive ( <= 0) arrival times denote that a particular student arrived early or on time; positive arrival times represent how many minutes late a student was to class. On time is not late.


Output

Print YES for each case if the class is canceled; print NO otherwise.


Example

Input

2
4 3
-1 -3 4 2
4 2
0 -1 2 1

Output

YES
NO

For the first case, K = 3 so three students must be present at the start of class for it to remain un-canceled. Only two show up, so the class is canceled.

For the second, Two students must be present at the start, and two are, so class continues.

I’ll post a solution in one day.

problem source here

6 Likes

Hmmm this looks interesting! I’ll need to do this when I have more time!

EDIT: I’ve done it, and heres my solution

Not exactly super brief, but it works! Took me about 30 minutes.

That was a good fun 5 mins to do this morning :smiley:

Solutions:


Ruby

#!/bin/ruby
t = gets.strip.to_i
t.times do |x|
    n,k = gets.strip.split(" ").map(&:to_i)
    arr = gets.strip.split(" ").map(&:to_i)
    here = 0
    arr.each do |arrival_time|
        here += 1 if arrival_time <= 0
    end
    puts (here < k ? "YES" : "NO")
end

C++

#include <iostream>
using namespace std;
int main(){
    int t; cin >> t;
    while (t-- > 0) {
        int n,k; cin >> n >> k;
        
        int here = 0, tmp;
        for (int i = 0; i < n; i++) {
            cin >> tmp;
            if (tmp <= 0) here++;
        }
        cout << (here < k ? "YES" : "NO") << endl;
    }
    return 0;
}

C

#include <stdio.h>

int main(){
    int t; scanf("%d",&t);
    while(t-- > 0) {
        int n,k; scanf("%d %d", &n,&k);
        int here = 0, tmp;
        for (int i = 0; i < n; i++) {
            scanf("%d", &tmp);
            if (tmp <= 0) here++;
        }
        printf("%s\n", (here < k ? "YES" : "NO"));
    }
    return 0;
}

Java

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        while (t-- > 0) {
            int n = in.nextInt();
            int k = in.nextInt();
            int here = 0, tmp;
            for(int a_i=0; a_i < n; a_i++){
                tmp = in.nextInt();
                if (tmp <= 0)
                    here++;
            }
            if (here < k) System.out.println("YES");
            else System.out.println("NO");
        }
    }
}

Perl

#!/usr/bin/perl

<>;
while (($n, $k) = split (/\s+/, <>))
  {
    @d = split (/\s+/, <>);
    die "Malformed line\n" if ($#d != --$n);
    for ($i = 0, $res =0; $i <= $#d && $res < $k; $i++)
      {
	$res++ if ($d[$i] < 1);
      }

    print (($res >= $k) ? "NO\n" : "YES\n" );
  }

I haven’t used foreach so I can add the condition for early leaving the loop

1 Like

Python

#!/usr/bin/env python

is_off = []
for i in range(int(raw_input())):
    N, K = [int(i) for i in raw_input().split()]
    here = sum(1 for i in raw_input().split() if int(i) <= 0)
    is_off.append('YES' if here < K else 'NO')
print '\n'.join(is_off)
2 Likes

This topic was automatically closed after 30 days. New replies are no longer allowed.