• greedy algorithm, insertion sort, quick sort


    always makes the choice that seems to be the best at that moment. 

    Example #1:

    @function:  scheduling

    // You are given an array A of integers, where each element indicates the time
    // thing takes for completion. You want to calculate the maximum number of things
    // that you can do in the limited time that you have.

    //
    //  main.cpp
    //  greedy
    
    #include <iostream>
    
    using std::cout;
    using std::cin;
    using std::string;
    
    #define SIZEOF_ARRAY(a) (sizeof(a)/sizeof(a[0]))
    
    template<typename T>
    void insertion_sort(T *a, size_t n) {
        T tmp;
        size_t j, p;
        for (p = 1; p < n; p++) {
            tmp = a[p];
            for (j = p; 0 < j && tmp < a[j-1]; j--) {
                a[j] = a[j-1];
            }
            a[j] = tmp;
        }
    }
    
    template<typename T>
    void swap(T *a, T *b) {
        T tmp = *a;
        *a = *b;
        *b = tmp;
    }
    
    // Return median of "left", "center", and "right"
    // Order these and hide the pivot
    template<typename T>
    T median3(T *a, size_t left, size_t right) {
        size_t center = (left+right)/2;
        if (a[left] > a[center])
            swap(&a[left], &a[center]);
        if (a[left] > a[right])
            swap(&a[left], &a[right]);
        if (a[center] > a[right])
            swap(&a[center], &a[right]);
        
        /* Invariant: a[left]<=a[center]<=a[right] */
        swap(&a[center], &a[right-1]); /* HIde pivot */
        return a[right-1]; /* return pivot */
    }
    
    #define cutoff (3)
    template<typename T>
    void quicksort(T *a, size_t left, size_t right) {
        size_t i, j;
        T pivot;
        if (left + cutoff <= right) {
            pivot = median3(a, left, right);
            i = left;
            j = right-1;
            for (;;) {
                while (a[++i] < pivot) {}
                while (a[--j] > pivot) {}
                if (i < j)
                    swap(&a[i], &a[j]);
                else
                    break;
            }
            swap(&a[i], &a[right-1]); /* restore pivot */
            
            quicksort(a, left, i-1);
            quicksort(a, i+1, right);
        } else {
            insertion_sort(a+left, right-left+1);
        }
    }
    
    template<typename T>
    void sort(T *a, size_t n) {
        quicksort(a, 0, n-1);
    }
    
    template<typename T>
    void print_array(T *a, size_t n) {
        size_t i;
        cout << "[";
        for (i = 0; i < n-1; i++) {
            cout << a[i] << ",";
        }
        cout << a[i] << "]
    ";
    }
    
    int scheduling(int *a, size_t n, int t) {
        int numberOfThings = 0, currentTime = 0;
        
        sort<int>(a, n);
        print_array<int>(a, n);
        
        for (int i = 0; i < n; i++) {
            currentTime += a[i];
            if (currentTime > t) {
                break;
            }
            numberOfThings++;
        }
        return numberOfThings;
    }
    
    int main(int argc, const char * argv[]) {
        
        int a[] = {15, 17, 15, 18, 10};
        int t = 40, n = SIZEOF_ARRAY(a);
        
        cout << "the Scheduling problem output: "<< scheduling(a, n, t) << "
    ";
        
        return 0;
    }
    

    output:

    the Scheduling problem output: [10,15,15,17,18]

    3

    Program ended with exit code: 0

    https://www.hackerearth.com/zh/practice/algorithms/dynamic-programming/bit-masking/tutorial/  

    https://www.geeksforgeeks.org/greedy-algorithm-to-find-minimum-number-of-coins/

  • 相关阅读:
    MySQL高级查询总结
    MySQL数据库作业
    MySQLdump备份还原命令
    MySQL之Join
    MySQL课堂作业(一)
    Mysql数据库
    Js实例之简易计算器
    JS系统函数
    js课堂作业之转换月份
    C++ Name Mangling 为什么不编码返回值参数
  • 原文地址:https://www.cnblogs.com/mingzhanghui/p/9382024.html
Copyright © 2020-2023  润新知