Bird
Raised Fist0
DSA Cprogramming~5 mins

Why Greedy Works and When It Fails in DSA C - Quick Recap

Choose your learning style10 modes available
Recall & Review
beginner
What is the main idea behind the greedy algorithm approach?
A greedy algorithm makes the best choice at each step, hoping to find the overall best solution by building it piece by piece.
Click to reveal answer
intermediate
When does a greedy algorithm guarantee an optimal solution?
When the problem has the greedy-choice property and optimal substructure, meaning local best choices lead to a global best solution.
Click to reveal answer
intermediate
What is the greedy-choice property?
It means that a locally optimal choice can be extended to a globally optimal solution without reconsidering previous choices.
Click to reveal answer
intermediate
Give an example of a problem where greedy algorithms fail to find the optimal solution.
The coin change problem with arbitrary coin denominations can fail with greedy algorithms because picking the largest coin first may not lead to the fewest coins overall.
Click to reveal answer
intermediate
Why does the greedy algorithm fail in some problems?
Because the problem lacks the greedy-choice property or optimal substructure, so local best choices do not lead to the global best solution.
Click to reveal answer
Which property must a problem have for a greedy algorithm to always work?
ARandomness
BGreedy-choice property
CBrute force
DBacktracking
What does optimal substructure mean in the context of greedy algorithms?
AProblem has no solution
BProblem requires random guessing
CProblem can be divided into smaller subproblems with optimal solutions
DProblem needs backtracking
Why might greedy algorithms fail on the coin change problem with arbitrary coins?
ABecause picking the largest coin first may not minimize total coins
BBecause coins are unlimited
CBecause greedy algorithms always work on coin change
DBecause coins have the same value
Which of these is NOT a characteristic of problems solved by greedy algorithms?
ARequires checking all combinations
BOptimal substructure
CLocal choices lead to global optimum
DGreedy-choice property
What is a key difference between greedy algorithms and dynamic programming?
AGreedy uses recursion; dynamic programming does not
BGreedy algorithms always fail
CDynamic programming is always faster
DGreedy makes local choices; dynamic programming considers all subproblems
Explain why greedy algorithms work for some problems but fail for others.
Think about how local best choices relate to the overall best solution.
You got /4 concepts.
    Describe the greedy-choice property and give an example of a problem that has it.
    Focus on how choosing the best option at each step leads to the best total result.
    You got /3 concepts.

      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