Bird
Raised Fist0
DSA Cprogramming~10 mins

Why Greedy Works and When It Fails in DSA C - Test Your Knowledge

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to select the next item with the highest value-to-weight ratio in the greedy algorithm for the fractional knapsack problem.

DSA C
int selectNextItem(float values[], float weights[], int n) {
    int maxIndex = 0;
    float maxRatio = values[0] / weights[0];
    for (int i = 1; i < n; i++) {
        float ratio = values[i] / weights[i];
        if (ratio [1] maxRatio) {
            maxRatio = ratio;
            maxIndex = i;
        }
    }
    return maxIndex;
}
Drag options to blanks, or click blank then click option'
A>
B<
C==
D<=
Attempts:
3 left
💡 Hint
Common Mistakes
Using '<' instead of '>' causes the algorithm to pick the lowest ratio item.
Using '==' will never update maxRatio after initialization.
2fill in blank
medium

Complete the code to check if the greedy algorithm fails for the coin change problem with arbitrary coin denominations.

DSA C
int canMakeChange(int coins[], int n, int amount) {
    int count = 0;
    for (int i = n - 1; i >= 0; i--) {
        while (amount >= coins[i]) {
            amount -= coins[i];
            count++;
        }
    }
    if (amount [1] 0) {
        return count;
    } else {
        return -1; // Cannot make exact change
    }
}
Drag options to blanks, or click blank then click option'
A==
B<
C>
D!=
Attempts:
3 left
💡 Hint
Common Mistakes
Checking if amount > 0 instead of == 0 leads to incorrect success.
Using '!=' causes the function to return count even when change is not exact.
3fill in blank
hard

Fix the error in the greedy interval scheduling algorithm that selects intervals with earliest finish time.

DSA C
void greedyIntervalScheduling(int start[], int finish[], int n) {
    int count = 1;
    int lastFinish = finish[0];
    for (int i = 1; i < n; i++) {
        if (start[i] [1] lastFinish) {
            count++;
            lastFinish = finish[i];
        }
    }
    printf("Maximum intervals: %d\n", count);
}
Drag options to blanks, or click blank then click option'
A<
B>
C<=
D>=
Attempts:
3 left
💡 Hint
Common Mistakes
Using '<=' causes incorrect counting of overlapping intervals.
Using '<' or '>=' may include intervals that overlap or just touch.
4fill in blank
hard

Fill both blanks to complete the greedy algorithm for activity selection that sorts intervals by finish time and selects compatible activities.

DSA C
void activitySelection(int start[], int finish[], int n) {
    // Assume intervals are sorted by finish time
    int count = 1;
    int lastSelected = 0;
    for (int i = 1; i < n; i++) {
        if (start[i] [1] finish[lastSelected]) {
            count++;
            lastSelected = [2];
        }
    }
    printf("Number of activities selected: %d\n", count);
}
Drag options to blanks, or click blank then click option'
A>=
B>
Ci
DlastSelected
Attempts:
3 left
💡 Hint
Common Mistakes
Using '>' instead of '>=' may exclude activities that start exactly at the finish time.
Not updating lastSelected to i causes incorrect tracking of selected activities.
5fill in blank
hard

Fill all three blanks to implement a greedy approach that builds a solution by choosing the locally optimal option at each step.

DSA C
void greedySolution(int arr[], int n) {
    int result = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i] [1] 0) {
            result += arr[i] [2] 1;
        } else {
            result [3] arr[i];
        }
    }
    printf("Result: %d\n", result);
}
Drag options to blanks, or click blank then click option'
A>
B+=
C=
D<
Attempts:
3 left
💡 Hint
Common Mistakes
Using '<' instead of '>' reverses the condition logic.
Using '=' instead of '+=' causes loss of accumulated result.

Practice

(1/5)
1. What is the main reason a greedy algorithm works correctly for some problems?
easy
A. Because it makes the best choice at each step hoping for a global optimum
B. Because it tries all possible solutions and picks the best one
C. Because it uses recursion to explore all options
D. Because it sorts the input data before processing

Solution

  1. Step 1: Understand greedy choice property

    A greedy algorithm picks the best option available at the current step without reconsidering previous choices.
  2. Step 2: Connect greedy choice to global optimum

    For some problems, making the best local choice at each step leads to the best overall solution.
  3. Final Answer:

    Because it makes the best choice at each step hoping for a global optimum -> Option A
  4. Quick Check:

    Greedy choice property = Because it makes the best choice at each step hoping for a global optimum [OK]
Hint: Greedy picks best local choice hoping for best overall [OK]
Common Mistakes:
  • Thinking greedy tries all solutions
  • Confusing greedy with recursion or backtracking
  • Assuming sorting alone makes greedy correct
2. Which of the following is the correct syntax to pick the next item greedily from a sorted array arr in C?
easy
A. int next = arr[--i];
B. int next = arr[i]; i++;
C. int next = arr[++i];
D. int next = arr[i]; i--;

Solution

  1. Step 1: Understand post-increment vs pre-increment

    Post-increment i++ returns current value then increments; pre-increment ++i increments then returns.
  2. Step 2: Choose syntax that picks current item then moves forward

    int next = arr[i]; i++; picks current element and then increments index for next pick.
  3. Final Answer:

    int next = arr[i]; i++; -> Option B
  4. Quick Check:

    Pick current then increment index = int next = arr[i]; i++; [OK]
Hint: Pick current element then increment index separately [OK]
Common Mistakes:
  • Using pre-increment which skips first element
  • Decrementing index instead of incrementing
  • Confusing post-increment inside array index
3. Consider the following C code that tries to select intervals greedily by earliest finish time:
typedef struct {
  int start;
  int end;
} Interval;

int main() {
  Interval arr[] = {{1,4}, {3,5}, {0,6}, {5,7}, {8,9}};
  int n = 5, count = 0, last_end = 0;
  for (int i = 0; i < n; i++) {
    if (arr[i].start >= last_end) {
      count++;
      last_end = arr[i].end;
    }
  }
  printf("%d\n", count);
  return 0;
}
What is the output?
medium
A. 3
B. 4
C. 5
D. 2

Solution

  1. Step 1: Trace interval selection without sorting

    Intervals are checked in given order: {1,4}, {3,5}, {0,6}, {5,7}, {8,9}. - Pick {1,4} (start 1 >= 0), count=1, last_end=4 - {3,5} start 3 < 4 skip - {0,6} start 0 < 4 skip - {5,7} start 5 >= 4 pick, count=2, last_end=7 - {8,9} start 8 >= 7 pick, count=3, last_end=9
  2. Step 2: Check if output matches options

    Count is 3, but 2 is 2, so check carefully: initial last_end=0, first interval start=1 >=0 pick count=1 Second interval start=3 < 4 skip Third start=0 < 4 skip Fourth start=5 >=4 pick count=2 Fifth start=8 >=7 pick count=3 Output is 3
  3. Final Answer:

    3 -> Option A
  4. Quick Check:

    Greedy without sorting picks 3 intervals [OK]
Hint: Without sorting, greedy may pick fewer intervals [OK]
Common Mistakes:
  • Assuming intervals are sorted by end time
  • Counting all intervals without checking overlap
  • Confusing start and end comparisons
4. The following code tries to solve the coin change problem greedily by picking the largest coin first. What is the bug?
int coins[] = {25, 10, 5, 1};
int amount = 30, count = 0;
for (int i = 0; i < 4; i++) {
  while (amount >= coins[i]) {
    amount -= coins[i];
    count++;
  }
}
printf("%d\n", count);
medium
A. The coin array is not sorted in descending order
B. The amount variable should be reset inside the loop
C. Greedy fails for some amounts, so this may not give minimum coins
D. The loop should run backwards from smallest coin

Solution

  1. Step 1: Understand greedy coin change approach

    The code picks largest coin repeatedly until amount is reduced, then moves to smaller coins.
  2. Step 2: Identify when greedy fails

    Greedy works for US coins but fails for some coin sets or amounts (e.g., coins {10,6,1} and amount 12). Here, greedy may not minimize coin count.
  3. Final Answer:

    Greedy fails for some amounts, so this may not give minimum coins -> Option C
  4. Quick Check:

    Greedy coin change can fail minimum count [OK]
Hint: Greedy coin change not always minimal [OK]
Common Mistakes:
  • Thinking sorting fixes greedy failure
  • Changing loop direction without reason
  • Resetting amount inside loop incorrectly
5. You want to schedule the maximum number of non-overlapping meetings from this list:
struct Meeting { int start; int end; };
Meeting meetings[] = {{0,10}, {1,3}, {4,5}};
int n = 3;
Which approach guarantees the maximum meetings scheduled and why does a greedy approach based on earliest start time fail here?
hard
A. Sort by longest duration and pick greedily; shortest duration fails because it picks too many meetings
B. Sort by earliest start time and pick greedily; earliest finish time fails because it ignores start times
C. Pick meetings randomly; sorting is not needed for maximum scheduling
D. Sort by earliest finish time and pick greedily; earliest start time fails because it may pick long meetings blocking others

Solution

  1. Step 1: Identify correct greedy strategy for interval scheduling

    Sorting meetings by earliest finish time and picking those that start after last chosen meeting's end maximizes count.
  2. Step 2: Explain why earliest start time fails

    Picking by earliest start time may select long meetings first, blocking many others, reducing total count.
  3. Final Answer:

    Sort by earliest finish time and pick greedily; earliest start time fails because it may pick long meetings blocking others -> Option D
  4. Quick Check:

    Earliest finish time sorting = max meetings [OK]
Hint: Sort by finish time, not start time, for max meetings [OK]
Common Mistakes:
  • Sorting by start time only
  • Ignoring meeting durations
  • Assuming random picks work
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard