Optimizing Algorithms for Competitive Programming Challenges

Approach

Check if all input value are identical.

Solution Code


#include <iostream>
#include <vector>

bool checkUniform(const std::vector<int>& values) {
    for(size_t i = 1; i < values.size(); ++i) {
        if(values[i] != values[0]) return false;
    }
    return true;
}

int main() {
    int testCases;
    std::cin >> testCases;
    
    while(testCases--) {
        std::vector<int> inputs(4);
        for(auto &val : inputs) std::cin >> val;
        std::cout << (checkUniform(inputs) ? "NO\n" : "YES\n");
    }
    return 0;
}

Crossing Street Problem

Approach

Consider different traffic light scenarios:

  • Green light:
    • Sufficient time remaining: Cross immediately
    • Insufficient time: Wait for next cycle
  • Red light: Wait until green

Solution Code


#include <iostream>

int calculateTime(int greenDur, int redDur, int crossTime, char current) {
    if(current == 'G') {
        return (greenDur >= crossTime) ? crossTime : crossTime + greenDur + redDur;
    }
    return redDur + crossTime;
}

int main() {
    int g, r, k, t;
    char state;
    std::cin >> g >> r >> k >> t >> state;
    std::cout << calculateTime(g, r, t, state) << "\n";
    return 0;
}

String Coloring Problem

Approach

Color each character individually since single-character segments are white by default.

Solution Code


#include <iostream>
#include <string>

void printColorRanges(int length) {
    std::cout << length << "\n";
    for(int i = 1; i <= length; ++i) {
        std::cout << i << " " << i << "\n";
    }
}

int main() {
    int tests;
    std::cin >> tests;
    while(tests--) {
        int n;
        std::string s;
        std::cin >> n >> s;
        printColorRanges(n);
    }
    return 0;
}

Energy Necklace Problem

Approach

Maintain prefix and suffix maximmus to find optimal remaining segments after operations.

Solution Code


#include <iostream>
#include <vector>
#include <algorithm>

int maxEnergy(std::vector<int>& gems, int operations) {
    int size = gems.size();
    if(size == 1) return gems[0];
    
    std::vector<int> prefixMax(size), suffixMax(size);
    prefixMax[0] = gems[0];
    for(int i = 1; i < size; ++i) {
        prefixMax[i] = std::max(prefixMax[i-1], gems[i]);
    }
    
    suffixMax[size-1] = gems.back();
    for(int i = size-2; i >= 0; --i) {
        suffixMax[i] = std::max(suffixMax[i+1], gems[i]);
    }
    
    int maxLen = std::max(2, size - operations);
    int result = 0;
    for(int i = 0; i <= size - maxLen; ++i) {
        result = std::max(result, prefixMax[i] + suffixMax[i + maxLen - 1]);
    }
    return result;
}

int main() {
    int testCases;
    std::cin >> testCases;
    while(testCases--) {
        int n, k;
        std::cin >> n >> k;
        std::vector<int> items(n);
        for(auto &item : items) std::cin >> item;
        std::cout << maxEnergy(items, k) << "\n";
    }
    return 0;
}

Tags: competitive-programming algorithm-optimization cpp data-structures

Posted on Wed, 13 May 2026 20:39:27 +0000 by netcoord99