diff --git a/algorithms/cpp/minimumCostForTickets/MinimumCostForTickets.cpp b/algorithms/cpp/minimumCostForTickets/MinimumCostForTickets.cpp new file mode 100644 index 0000000..79dff08 --- /dev/null +++ b/algorithms/cpp/minimumCostForTickets/MinimumCostForTickets.cpp @@ -0,0 +1,99 @@ +// Source : https://leetcode.com/problems/minimum-cost-for-tickets/ +// Author : Hao Chen +// Date : 2019-01-29 + +/***************************************************************************************************** + * + * In a country popular for train travel, you have planned some train travelling one year in advance. + * The days of the year that you will travel is given as an array days. Each day is an integer from 1 + * to 365. + * + * Train tickets are sold in 3 different ways: + * + * a 1-day pass is sold for costs[0] dollars; + * a 7-day pass is sold for costs[1] dollars; + * a 30-day pass is sold for costs[2] dollars. + * + * The passes allow that many days of consecutive travel. For example, if we get a 7-day pass on day + * 2, then we can travel for 7 days: day 2, 3, 4, 5, 6, 7, and 8. + * + * Return the minimum number of dollars you need to travel every day in the given list of days. + * + * Example 1: + * + * Input: days = [1,4,6,7,8,20], costs = [2,7,15] + * Output: 11 + * Explanation: + * For example, here is one way to buy passes that lets you travel your travel plan: + * On day 1, you bought a 1-day pass for costs[0] = $2, which covered day 1. + * On day 3, you bought a 7-day pass for costs[1] = $7, which covered days 3, 4, ..., 9. + * On day 20, you bought a 1-day pass for costs[0] = $2, which covered day 20. + * In total you spent $11 and covered all the days of your travel. + * + * Example 2: + * + * Input: days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15] + * Output: 17 + * Explanation: + * For example, here is one way to buy passes that lets you travel your travel plan: + * On day 1, you bought a 30-day pass for costs[2] = $15 which covered days 1, 2, ..., 30. + * On day 31, you bought a 1-day pass for costs[0] = $2 which covered day 31. + * In total you spent $17 and covered all the days of your travel. + * + * Note: + * + * 1 <= days.length <= 365 + * 1 <= days[i] <= 365 + * days is in strictly increasing order. + * costs.length == 3 + * 1 <= costs[i] <= 1000 + * + ******************************************************************************************************/ + +class Solution { +private: + int min(int x, int y){ + return x < y ? x : y; + } + int min(int x, int y, int z) { + return min(min(x, y), z); + } +public: + int mincostTickets(vector& days, vector& costs) { + + // Dynamic Programming + vector dp(days.size(), INT_MAX); + + // dp[i] is the minimal cost from Days[0] to Days[i] + dp[0] = costs[0]; + + for (int i = 1; i< days.size(); i ++) { + + // the currnet day need at least 1-day pass cost + int OneDayPass = dp[i-1] + costs[0]; + + // Seprating the array to two parts. + // days[0] -> days[j] -> day[i] + // + // calculate the day[i] - day[j] whether can use 7-day pass or 30-day pass + // + // Traking the minimal costs, then can have dp[i] minimal cost + + int SevenDayPass = INT_MAX, ThrityDayPass = INT_MAX; + for (int j=i-1; j>=0; j--){ + if (days[i] - days[j] < 7 ) { + SevenDayPass = dp[j-1] + costs[1]; + } else if (days[i] - days[j] < 30 ) { + ThrityDayPass = dp[j-1] + costs[2]; + } else { + break; + } + int m = min(OneDayPass, SevenDayPass, ThrityDayPass); + if ( dp[i] > m ) dp[i] = m; + } + + } + + return dp[dp.size()-1]; + } +}; diff --git a/algorithms/cpp/stringWithoutAAAOrBBB/StringWithoutAAAOrBBB.cpp b/algorithms/cpp/stringWithoutAAAOrBBB/StringWithoutAAAOrBBB.cpp new file mode 100644 index 0000000..8609aab --- /dev/null +++ b/algorithms/cpp/stringWithoutAAAOrBBB/StringWithoutAAAOrBBB.cpp @@ -0,0 +1,77 @@ +// Source : https://leetcode.com/problems/string-without-aaa-or-bbb/ +// Author : Hao Chen +// Date : 2019-01-29 + +/***************************************************************************************************** + * + * Given two integers A and B, return any string S such that: + * + * S has length A + B and contains exactly A 'a' letters, and exactly B 'b' letters; + * The substring 'aaa' does not occur in S; + * The substring 'bbb' does not occur in S. + * + * Example 1: + * + * Input: A = 1, B = 2 + * Output: "abb" + * Explanation: "abb", "bab" and "bba" are all correct answers. + * + * Example 2: + * + * Input: A = 4, B = 1 + * Output: "aabaa" + * + * Note: + * + * 0 <= A <= 100 + * 0 <= B <= 100 + * It is guaranteed such an S exists for the given A and B. + ******************************************************************************************************/ + +class Solution { +public: + string strWithout3a3b(int A, int B) { + + string result; + while (true){ + + // if A == B, then just simpley repeat "ab" pattern; + if (A == B) { + for ( int i=0; i 0 ) result += 'a'; + while ( B-- > 0 ) result += 'b'; + break; + } + + // if A+B >=3 and A !=B + + // if A > B, then we need consume 'a' more than 'b' + // So, only "aab" can be used. + if ( A > B ) { + result += "aab"; + A -= 2; + B--; + continue; + } + + // if A > B, then we need consume 'b' more than 'a' + // So, only "bba" can be used. + if (B > A ){ + result += "bba"; + B-=2; + A--; + continue; + } + + } + + return result; + } +};