Как найти минимальную стоимость билетов

Here is the C++ solution including print outs

#include <vector>
#include <iostream>
#include <cmath>
#include <algorithm>
int compute(std::vector<int> &A)
{
int sum[A.size()][A.size()+1];
for (int i = 0; i < A.size(); i++)
{
    for(int j =0; j < A.size(); j++)
    {
        sum[i][j]=2;
    }
}

for (int k = 0; k < A.size();k++)
{
    sum[k][A.size()]=0;
}

for (int i = 0; i < A.size(); i++)
{
    for(int j = 0; j < A.size(); j++)
    {
        if (i!=j)
        {
            if (sum[i][i] != 7)
            {
                int temp = abs(A[j]-A[i]);
                if (temp<7 && abs(j-i)>=3)
                {   
                    sum[i][i]=7;
                    sum[i][j]=7;
                    if (i>j)
                    {
                        for(int k = j;k < i;k++)
                            sum[i][k]=7;
                    }
                    else
                    {
                        for(int k = i;k < j;k++)
                            sum[i][k]=7;
                    } 
                }
            }
        }
    }
}

for (int i = 0; i < A.size(); ++i)
{
    for(int j = 0; j < A.size(); ++j)
    {
        if (sum[i][j]==7)
        {
            sum[i][A.size()]+=1;
        }
    }
}

for (int i = 0; i < A.size(); ++i)
{
    for (int j = 0; j < A.size()+1; ++j)
        std::cout<<sum[i][j]<<" ";
    std::cout<<std::endl;
}


int result = 0;
int row = A.size()-1;
int column = A.size()-1;
while(1)
{
    int value = sum[row][A.size()];
    if (value == 0)
        value=1;
    int temp = sum[row][column];
    result += temp;
    row = row-value;
    column = column-value;
    while (sum[row][column+1]==7 && row>=0)
    {
        row-=1;
        column-=1;
        result+=2;
    }
    if (row < 0)
        break;
}

return result;
}

int solution(std::vector<int> &A) {
if (A.size() > 24)
    return 25;
if (A.size() <= 3)
    return A.size() * 2;

return std::min(25,compute(A));
}

int main()
{
std::vector<int> AA={1,2,3,4,5,29,30};
std::vector<int> B={1,2,3,4,5};
std::vector<int> A={1,2,3,4,5,9,10,11,12,13,14,17,18,20,21};
std::vector<int> C={1,2,3,12};
std::vector<int> D={1,2,3,4,12,13,14,15,29,30};
std::vector<int> DD={1,2,3,4,5,14,17,18,19,20,23,28,29,30};
std::vector<int> CC={1,2,3,4,5,6,7,9,14,17,18,19,20,23,28,29,30};
std::cout<<solution(AA)<<std::endl;
std::cout<<solution(D)<<std::endl;
std::cout<<solution(B)<<std::endl;
std::cout<<solution(A)<<std::endl;
std::cout<<solution(C)<<std::endl;
std::cout<<solution(DD)<<std::endl;
std::cout<<solution(CC)<<std::endl;
return 0;
}

Если знать, как дешево купить авиабилет, то путешествовать можно будет не раз в год, а хоть каждый месяц! Важно подходить к покупке с умом: учитывать время суток, день недели, сезонность, количество дней до вылета и много других факторов, которые влияют на цену.

Мы подготовили для вас пятнадцать лучших советов, благодаря которым вы начнете экономить на перелетах.

Когда дешевле покупать билеты на самолет: заранее или перед вылетом?

Итак, за сколько месяцев нужно приступить к подготовке к поездке? Самое идеальное – это начать планировать свое путешествие примерно за полгода или три месяца до вылета. Например, если вы собираетесь летом в отпуск, то бронировать билеты лучше уже в декабре.

scyscanner.com
scyscanner.com

А все дело в том, что авиакомпании устраивают продажи таким образом, чтобы загрузить рейсы на несколько месяцев вперед и получить как можно больше прибыли. Раннее бронирование хорошо тем, что многие авиакомпании предлагают скидочные или бонусные программы. Так, некоторые билеты могут стоить даже в два раза дешевле, если покупать их за полгода до путешествия. Не думайте, что это невозможно. В среднем скидка при ранней покупке будет не меньше 25%.

Если вы думаете, что дешевле будет купить билет незадолго перед вылетом, то вы ошибаетесь. За две недели до путешествия цены резко повышаются и попасть на скидки или акции просто невозможно. В процентном соотношении цена билетов выглядит примерно так: 20% пассажиров платят меньше всего, потому что приобретают билеты заблаговременно, большинство пассажиров — примерно 65% – покупают за среднюю стоимость, а 15% платят выше нормы, покупая билеты в последний момент. Старайтесь быть среди тех счастливых 20%!

Некоторые исследования также показывают, что хорошие цены на авиабилеты бывают за 8 недель до перелета. Так что даже если вы не успели стать теми счастливчиками, купившими билеты за максимально низкую цену, вы еще можете успеть приобрести их по стоимости ниже средней.

А теперь давайте посмотрим, какими хитростями можно пользоваться, чтобы попасть на самые выгодные предложения!

Бронируйте во второй половине дня

quickanddirtytips.com
quickanddirtytips.com

Большинство людей думает, что цены на билеты зависят только от дня недели, но не многие задумываются о том, что стоимость варьируется также в зависимости от времени суток. Так, чтобы сэкономить, проверяйте билеты во второй половине дня. Утром, когда начинается рабочее время, цены повышаются, потому что именно тогда люди, путешествующие по работе, покупают большинство билетов.

Мониторьте билеты в нерабочее время

Кроме того, проверять цены билетов можно и тогда, когда рабочий день уже завершен или еще не начался: то есть ранним утром или поздним вечером и даже ночью. Считается, что именно тогда выбор билетов гораздо больше и лучше, а цены ниже.

Пользуйтесь метапоисковиками

aviasales.ru
aviasales.ru

Существуют сайты, которые ищут самые выгодные для покупателя авиабилеты, сравнивая цены разных перевозчиков. Это очень удобно, потому что вам не придется самому искать самую дешевую авиакомпанию. Так, самые популярные русские метапоисковики — это Aviasales, Skyscanner, Momodo.

Они берут данные более семисот перевозчиков, а также у них есть календарь низких цен, который поможет вам выбрать наиболее подходящий день для вылета, когда перелет выгоднее. Можно также рассмотреть англоязычный подобный сайт Drungli. Он очень хорош еще и тем, что вы можете выбрать самые дешевые билеты в любой уголок Земли, которые существуют. Если вы еще не выбрали направление, то этот ресурс вам может помочь.

Важно! После того, как вы нашли подходящий билет в метапоисковике, обязательно зайдите на сайт авиакомпании и проверьте, не дешевле ли он так и нет ли более удобных рейсов.

Покупайте билеты на сайте авиакомпании

dribbble.com
dribbble.com

Несмотря на то, что метапоисковики предлагают наиболее удобные варианты, есть возможность, что на сайте авиакомпании будут еще более хорошие рейсы. Кроме того, тут цена на билет всегда будет ниже, потому что авиакомпания не делает никаких накруток, сборов за оформление, дополнительных скрытых платежей и оплата будет полностью без какой-либо комиссии. Единственная доплата, которую придется совершить, это налог. Не пугайтесь: в некоторых авиакомпаниях он достаточно высок, но при этом цена на билет все равно остается вполне адекватной.

Кроме того, выгоднее покупать напрямую на сайте перевозчика, потому что курс доллара очень изменчив. А при бронировании через официальный сайт цена будет зафиксирована, даже если оплату вы произведете не сразу.

Кстати, если вы не уверены, где покупать билеты дешевле: в кассе аэропорта или через интернет, то мы уверенно вам ответим. Аэропорт — это такой же посредник, как и онлайн ресурсы, так что комиссию он брать будет. Но цена будет такой же, как на официальном сайте, если в аэропорту есть отдельная стойка с представителем нужного вам перевозчика.

Подпишитесь на уведомления об изменениях цены

appinstitute.com
appinstitute.com

Если вы уже нашли подходящий билет, проверили, сколько он стоит на сайте авиакомпании, и теперь надеетесь, что цена станет ниже, то мы предлагаем вам удобный вариант, который позволит вам расслабиться и не мониторить сайт каждый пол часа.

У каждой авиакомпании или ресурса по продаже авиабилетов есть возможность подписаться на уведомления по тем или иным билетам. Так, на Aviasales можно добавить понравившийся билет в «Избранное», и приложение на телефоне само будет вас оповещать об изменениях цены. Похожая система и у Skyscanner, и у Momodo. Так вы точно не пропустите скидку!

Подпишитесь на рассылки авиакомпаний, которыми пользуетесь

feedblitz.com
feedblitz.com

Так вы будете самыми первыми узнавать об интересных спецпредложениях! Авиакомпании всегда в первую очередь уведомляют о скидках и распродажах тех, кто на них подписан. Так что не игнорируйте такие письма, потому что, в отличие от рассылок разных магазинов, авиакомпании редко присылают спам или письма с ненужной информацией. Более того, подписывайтесь на аккаунты перевозчиков в социальных сетях, в Facebook и Instagram, где компании могут проводить разные конкурсы и разыгрывать скидки, мили и даже бесплатные полеты.

Самые приятные скидки и акции авиакомпании проводят в период с февраля по март, когда многие уже задумываются о летнем отпуске, а также хорошие скидки бывают с октября по ноябрь на предпраздничные месяцы. Кроме того, крупные авиаперевозчики не игнорируют международные скидочные дни. Они тоже предлагают выгодные билеты на «Черную пятницу» и в «Киберпонедельник».

Но медлить нельзя! Подобные выгодные билеты разбирают очень быстро, а много их никогда не бывает — обычно разыгрывают не больше двадцати. Но и на горячую голову принимать решение не стоит: скидочные или акционные билеты возврату или обмену не подлежат.

Программы лояльности — для всех

aviasales.ru
aviasales.ru

Даже если вы не частый путешественник и не обращаете внимание на авиакомпанию, с которой летите, все равно заполните анкету на участие в программе лояльности. Это совершенно бесплатно, зато так за каждый полет вам будут начисляться бонусные мили, накопив которые вы сможете выбрать бесплатный перелет, получить скидку или обменять их на что-то другое. Крупные авиакомпании сотрудничают с другими популярными сетями, так что мили можно использовать не только для полетов, но и для получения скидки в ресторане или магазине.

И самое приятное: будучи членом программы лояльности, вам будут доступны разные интересные акции и розыгрыши!

Пользуйтесь постоянными скидками

twitter.com
twitter.com

Еще один хитрый вариант получить хорошую скидку на перелет — это воспользоваться постоянным предложением. Если вы покупаете билет на свой день рождения, свадьбу или годовщину, являясь при этом участником программы лояльности, вам обязательно предоставят скидку от 5%. В отдельных случаях она может достигать даже 30% от стандартной цены!

Будьте гибкими

Если вы еще не определились с датой вылета, ориентируйтесь на цены билетов. На популярных ресурсах по продаже авиабилетов есть отдельные календари низких цен, которые покажут, сколько стоят билеты в ближайшие числа от того дня, который вы выберете.

Не летайте на выходных

Итак, в какой день лучше всего лететь? Старайтесь выбирать билеты так, чтобы перелеты выпадали на середину недели. Самые дешевые — во вторник, среду и четверг, а наиболее дорогие — в пятницы, на выходных и в праздники. Кстати, не забывайте, что цена билета зависит не только от того, есть ли праздник в вашей стране, но и отмечается ли какая-то особая дата в той стране, куда вы собираетесь.

И, конечно, важно помнить еще и о том, что самые дешевые билеты продают в низкий туристический сезон. Так, если вы хотите отдохнуть на море, лучше выбирать не летние месяцы, а конец весны или начало осени. В этот период погода в Средиземноморье еще теплая, а море достаточно прогрето для комфортного купания.

Летайте ночью

gloriuspublication.com
gloriuspublication.com

Что касается времени суток, то есть еще одна уловка. Выбирайте авиабилеты с перелетом в вечернее или ночное время — они всегда дешевле. А вот днем или утром обычно наиболее дорогие рейсы.

Помните, что если вы выбрали перелет ночью, то нужно заранее позаботиться о том, как вы будете добираться до гостиницы, потому что общественный транспорт может уже не работать.

Всегда берите билет сразу туда и обратно

Железное правило: всегда берите билеты в обе стороны. Они гораздо дешевле, чем покупать каждый перелет отдельно. А вот если метопоисковик предлагает составить сложный маршрут — задумайтесь. Подобные ресурсы часто путаются при поиске наиболее хороших вариантов, часто предлагая либо дорогие, либо совсем неудобные рейсы. В таком случае лучше действовать вручную.

Не бойтесь пересадок

lastminute-transfer.com
lastminute-transfer.com

Прямой рейс — это, безусловно, очень удобно, но зачастую еще и очень дорого. Поэтому рассматривайте варианты с пересадками. Во-первых, у вас будет возможность размяться между полетами, а во-вторых, вы сможете значительно сэкономить.

Важно! Всегда обращайте внимание на длительность и место пересадки. Если вы летите через город, в котором давно мечтали побывать, почему бы не выбрать вариант с пресадкой больше шести часов и не провести день в городе? Да, как следует посмотреть вы его не успеете, зато шапочно познакомиться — вполне. К тому же перелеты с длительной пересадкой еще дешевле, чем с короткой.

Пользуйтесь лоукостерами

У таких бюджетных авиакомпаний всегда самые дешевые билеты и масса акций и спецпредложений круглый год! Кроме того, здесь необязательно брать билет с питанием, багажом и онлайн-регистрацией. Отказавшись от этих дополнительных услуг, вы сможете отлично сэкономить.

Обязательно проверяйте и перепроверяйте, что именно входит в стоимость вашего билета. Лоукостеры берут деньги со всех (!) услуг, кроме самого перелета. Так, обязательно посмотрите на официальном сайте авиакомпании, сколько бесплатного багажа вы можете провезти. Очень часто путешественники попадаются на этот крючок и в итоге приходится доплачивать кругленькую сумму за обычный рюкзак.

Видео: как найти авиабилеты за копейки?

Ищите билеты инкогнито

Выбирая билеты, делайте это через режим Инкогнито. Он доступен и в Google Chrome, и в Opera. Для чего это нужно? Если вы несколько раз уже искали подходящие билеты или периодически мониторите цены на одних и тех же сайтах, то знайте: авиакомпании и ресурсы по поиску авиабилетов сохраняют все данные о ваших запросах.

Откуда вы, сколько времени тратите на просмотр билета, насколько экономически развита ваша страна, каким гаджетом вы пользуетесь для поиска — все это учитывается системой, которая по анализу этих данных решает, выдавать вам дешевые или дорогие билеты. Кстати, такую систему используют не только авиаперевозчики, но и многие интернет-магазины.

Теперь вы знаете, когда и как лучше всего покупать авиабилеты, чтобы сэкономить, но добраться до места отдыха с комфортом. Путешествия — это дешево, важно только знать, как правильно их планировать!

Найти минимальную стоимость билетов

Определите минимальную стоимость билетов, необходимую для покупки в известные дни месяца (1…30). Доступны три типа билетов: однодневный билет действителен в течение 1 дня и стоит 2 единицы, 7-дневный билет действителен в течение 7 дней и стоит 7 единиц, 30-дневный билет действителен в течение 30 дней и стоит 25 единиц.

Например: я хочу путешествовать в [1,4,6,7,28,30] дней месяца, т.е. 1, 4, 6… дня месяца. Как купить билеты так, чтобы стоимость была минимальной.

Я пытался использовать динамическое программирование для решения этой проблемы, но решение не дает мне правильный ответ для всех случаев. Вот мое решение на Java:

public class TicketsCost {
    public static void main(String args[]){
        int[] arr  =  {1,5,6,9,28,30};
        System.out.println(findMinCost(arr));
    }
    public static int findMinCost(int[] arr) {
        int[][] dp = new int[arr.length][3];
        int[] tDays = {1,7,30};
        int[] tCost = {2,7,25};

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < 3; j++) {
                if (j==0){
                    dp[i][j]= (i+1)*tCost[j];
                }
                else{
                    int c = arr[i]-tDays[j];
                    int tempCost = tCost[j];
                    int k;
                    if (c>=arr[0] && i>0){
                        for (k = i-1; k >= 0; k--) {
                            if (arr[k]<=c){
                                c = arr[k];
                            }
                        }
                        tempCost += dp[c][j];
                        int tempCostX =  dp[i-1][j] + tCost[0];
                        tempCost = Math.min(tempCost,tempCostX);

                    }
                    dp[i][j] = Math.min(tempCost,dp[i][j-1]);
                }
            }
        }
        return dp[arr.length-1][2];
    }
}

Решение не работает для {1,7,8,9,10} ввода, оно дает 10, но правильный ответ должен быть 9. Кроме того, для {1,7,8,9,10,15} оно дает 13 но правильный – 11. Я отправил свое решение не для других, чтобы отладить его для меня, но просто для справки. Для этой проблемы я выбрал подход динамического программирования снизу вверх. Правильный ли этот подход?

2016-11-12 03:18

4
ответа

Решение

Решено с использованием того же подхода восходящего динамического программирования. Вот полное решение:

public class PublicTicketCost {
    public static void main(String args[]){
        int[] arr  =  {1,7,8,9,10,15,16,17,18,21,25};
        int[] tDays = {1,7,30};
        int[] tCost = {2,7,25};
        System.out.println(minCost(arr, tDays, tCost));
    }
    public static int minCost(int[] arr, int[] tDays, int[] tCost) {
        int[][] dp = new int[arr.length][tDays.length];

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < tDays.length; j++) {

                int prevDayIndex = findPrevDayIndex(arr,i,tDays,j);
                int prevCost = prevDayIndex>=0 ? dp[prevDayIndex][tDays.length-1] : 0;
                int currCost = prevCost + tCost[j];
                if(j-1>=0){
                    currCost = Math.min(currCost, dp[i][j-1]);
                }
                dp[i][j] = currCost;
            }
        }
        //print(dp);
        return dp[arr.length-1][tDays.length-1];
    }
    private static void print(int arr[][]){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }
    private static int findPrevDayIndex(int[] arr, int i, int[] days, int j){
        int validAfterDate = arr[i] - days[j];
        if (validAfterDate<1){
            return -1;
        }
        for (int k = i-1; k >= 0; k--) {
            if (arr[k]<=validAfterDate){
                return k;
            }
        }
        return -1;
    }
}

http://ideone.com/sfgxGo

2016-11-12 05:25

Обозначим через MC (d) минимальные расходы, которые будут оплачиваться за все поездки в дни с 1 по d. Тогда желаемый ответ – MC(30).

Чтобы рассчитать MC (d), соблюдайте следующее:

  • Если в день d нет поездки, то MC (d) = MC (d – 1).
    • В особом случае MC (d) = 0 для всех d ≤ 0.
  • В противном случае минимальная стоимость подразумевает одно из следующего:
    • 1-дневный пропуск в день d. В этом случае MC (d) = MC (d – 1) + 2.
    • 7-дневный пропуск, заканчивающийся на или после дня d. В этом случае MC (d) = min (MC (d – 7), MC (d – 6),…, MC (d – 1)) + 7.
      • Из которых мы можем на самом деле исключить значения с MC (d- 3), MC (d- 2) и MC (d- 1), потому что дневные пропуски обязательно будут дешевле.
    • 30-дневный пропуск, охватывающий весь период. В этом случае MC (d) = 25.

Как вы поняли, динамическое программирование (рекурсия снизу вверх) хорошо подходит для этого.

Для простоты кодирования я предлагаю начать с преобразования списка дней в справочную таблицу для “это поездка?”:

boolean[] isDayWithTrip = new boolean[31]; // note: initializes to false
for (final int dayWithTrip : arr) {
    isDayWithTrip[dayWithTrip] = true;
}

Затем мы можем создать массив для отслеживания минимальных затрат и заполнить его, начиная с индекса 0:

int[] minCostUpThroughDay = new int[31];
minCostUpThroughDay[0] = 0; // technically redundant
for (int d = 1; d <= 30; ++d) {
    if (! isDayWithTrip[d]) {
        minCostUpThroughDay[d] = minCostUpThroughDay[d-1];
        continue;
    }

    int minCost;
    // Possibility #1: one-day pass on day d:
    minCost = minCostUpThroughDay[d-1] + 2;
    // Possibility #2: seven-day pass ending on or after day d:
    for (int prevD = Math.max(0, d - 7); prevD <= d - 4; ++prevD) {
        minCost = Math.min(minCost, minCostUpThroughDay[prevD] + 7);
    }
    // Possibility #3: 30-day pass for the whole period:
    minCost = Math.min(minCost, 25);

    minCostUpThroughDay[d] = minCost;
}

А также minCostUpThroughDay[30] это результат.

Вы можете увидеть приведенный выше код в действии по адресу: http://ideone.com/pwcyRb.

2016-11-12 04:57

Одно рекурсивное решение в Python3.

from typing import List


def solution(A: List[int]) -> int:
    if not any(A):
        return 0

    tickets = {
        1: 2,
        7: 7,
        30: 25,
    }

    import sys
    min_cost = sys.maxsize
    size = len(A)

    for length, price in tickets.items():
        current_cost = price
        idx = 0

        last_day = A[idx] + length

        while idx < size and A[idx] < last_day:
            idx += 1

        if current_cost > min_cost:
            continue

        current_cost += solution(A[idx:])
        if current_cost < min_cost:
            min_cost = current_cost

    return min_cost


if __name__ == '__main__':
    cases = {
        11: [1, 4, 6, 7, 28, 30],
        9: [1, 7, 8, 9, 10],
    }

    for expect, parameters in cases.items():
        status = (expect == solution(parameters))
        print("case pass status: %s, detail: %s == solution(%s)" %
              (status, expect, parameters))

2019-02-25 12:42

public class Main03v3
{
  public static void main(String[] args)
  {
    int[] A = {1,7,8,9,10,15,16,17,18,21,25};

    System.out.println("Traveling days:rn "+Arrays.toString(A));
    int cost = solution(A);
    System.out.println("rnMinimum cost is " + cost);
    System.out.println("rn" + new String(new char[40]).replace("", "-"));
  }

  public static int solution(int[] A) 
  {
    if (A == null) return -1;

    int sevenDays = 7;
    int dayCost = 2, weekCost = 7, monthCost = 25;
    int ratio_WeekAndDays = weekCost / dayCost; 

    int len = A.length;
    if (len == 0) return -1;

    if (len <= 3) return len * dayCost;

    int cost[] = new int[len];

    int i = 0;
    while (i < len)
    {
      int startIdx = i, endIdx = i + 1; 
      while (endIdx < len && A[endIdx]-A[startIdx] < sevenDays) 
        endIdx++;

      if (endIdx-startIdx > ratio_WeekAndDays)
      {
        if (endIdx >= startIdx + sevenDays) 
          endIdx = startIdx + sevenDays;  

        int j = startIdx;
        cost[j] = ((j == 0) ? 0 : cost[j-1]) + weekCost;

        while (++j < endIdx) {
          cost[j] = cost[j-1];
        }  
        i = j;
      }
      else
      {
        cost[i] = ((i == 0) ? 0 : cost[i-1]) + dayCost;
        i++;
      }  
    }
    int finalCost = Math.min(cost[len-1], monthCost);

    return finalCost;  
  }
}

2017-02-27 02:22

Найдите минимальную стоимость билетов в случае JavaScript 1: если входное значение равно [1,7,8,9,10], то требуемое значение равно 9; случай 2: если входное значение равно [1,7,8,9,10,15], то требуемый выход – 11

function calMinCosts(arr){
    if(!arr || arr.length===0)
        return 0;

    var len = arr.length; 
    var costsOfDateArr = Array.apply(null,{length:arr[len-1]+1}).map(()=>0);

    var price1=2,price2=7,price3=25;
    var days=7;

    var index=0,n=costsOfDateArr.length;
    for(var i=1;i<n;i++){
        if(i===arr[index]){
            if(i>=days+1){
                costsOfDateArr[i] = Math.min(costsOfDateArr[i-days-1]+price2, costsOfDateArr[i-1]+price1);
            }else{
                costsOfDateArr[i] = Math.min(costsOfDateArr[0]+price2, costsOfDateArr[i-1]+price1);
            }
            index+=1;
        }else{
            costsOfDateArr[i] = costsOfDateArr[i-1];
        }
    }

    return Math.min(price3,costsOfDateArr[n-1]);
}

console.log(calMinCosts([1,7,8,9,10]))
console.log(calMinCosts([1,7,8,9,10,15]))

2019-03-29 04:55

Вот решение C++, включая распечатки

#include <vector>
#include <iostream>
#include <cmath>
#include <algorithm>
int compute(std::vector<int> &A)
{
int sum[A.size()][A.size()+1];
for (int i = 0; i < A.size(); i++)
{
    for(int j =0; j < A.size(); j++)
    {
        sum[i][j]=2;
    }
}

for (int k = 0; k < A.size();k++)
{
    sum[k][A.size()]=0;
}

for (int i = 0; i < A.size(); i++)
{
    for(int j = 0; j < A.size(); j++)
    {
        if (i!=j)
        {
            if (sum[i][i] != 7)
            {
                int temp = abs(A[j]-A[i]);
                if (temp<7 && abs(j-i)>=3)
                {   
                    sum[i][i]=7;
                    sum[i][j]=7;
                    if (i>j)
                    {
                        for(int k = j;k < i;k++)
                            sum[i][k]=7;
                    }
                    else
                    {
                        for(int k = i;k < j;k++)
                            sum[i][k]=7;
                    } 
                }
            }
        }
    }
}

for (int i = 0; i < A.size(); ++i)
{
    for(int j = 0; j < A.size(); ++j)
    {
        if (sum[i][j]==7)
        {
            sum[i][A.size()]+=1;
        }
    }
}

for (int i = 0; i < A.size(); ++i)
{
    for (int j = 0; j < A.size()+1; ++j)
        std::cout<<sum[i][j]<<" ";
    std::cout<<std::endl;
}


int result = 0;
int row = A.size()-1;
int column = A.size()-1;
while(1)
{
    int value = sum[row][A.size()];
    if (value == 0)
        value=1;
    int temp = sum[row][column];
    result += temp;
    row = row-value;
    column = column-value;
    while (sum[row][column+1]==7 && row>=0)
    {
        row-=1;
        column-=1;
        result+=2;
    }
    if (row < 0)
        break;
}

return result;
}

int solution(std::vector<int> &A) {
if (A.size() > 24)
    return 25;
if (A.size() <= 3)
    return A.size() * 2;

return std::min(25,compute(A));
}

int main()
{
std::vector<int> AA={1,2,3,4,5,29,30};
std::vector<int> B={1,2,3,4,5};
std::vector<int> A={1,2,3,4,5,9,10,11,12,13,14,17,18,20,21};
std::vector<int> C={1,2,3,12};
std::vector<int> D={1,2,3,4,12,13,14,15,29,30};
std::vector<int> DD={1,2,3,4,5,14,17,18,19,20,23,28,29,30};
std::vector<int> CC={1,2,3,4,5,6,7,9,14,17,18,19,20,23,28,29,30};
std::cout<<solution(AA)<<std::endl;
std::cout<<solution(D)<<std::endl;
std::cout<<solution(B)<<std::endl;
std::cout<<solution(A)<<std::endl;
std::cout<<solution(C)<<std::endl;
std::cout<<solution(DD)<<std::endl;
std::cout<<solution(CC)<<std::endl;
return 0;
}

2017-04-22 16:20

Студворк — интернет-сервис помощи студентам

Сем и Юра вместе едут в метро. Всего едет n людей. Так же известно что каждому нужно будет совершить m поездок.
В метро есть три типа билетов:
• билет на одну поездку, который стоит “a” рублей.
• безлимитный билет на одного человека который стоит “b” рублей.
• групповой безлимитный билет на “k” людей который стоит “c” рублей.
Формат входных данных:
-первый ряд имеет 3 целых числа n, m и k ( 1 ≤ n, m, k ≤ 1000)
-второй ряд имеет 3 целых числа a, b и c (1 ≤ a, b, c ≤ 1000)
Формат выходных данных:
выведите единственное целое число — минимальную суммарную стоимость билетов.
Пример:
входные данные
7 4 5
2 7 20
выходные данные
34

Ответ:

Минимальная стоимость билетов для одного взрослого и одного ребенка 8 лет составит 3200 руб.

Пошаговое объяснение:

Требуется рассчитать минимальную стоимость билетов для одного взрослого и одного ребенка 8 лет, если они обязательно должны ехать в одном купе, рассматривают как нижние, так и верхние места, но не готовы ехать в купе около туалета.

Как мы видим, единственные места, которые подходят по условию, это  17 нижнее и 18 верхнее.

Билет на нижнее место стоит 3000 руб., на верхнее – 2000 руб.

Стоимость билета на ребенка восьми лет составляет 40% от полной стоимости билета.

1. Рассчитаем стоимость билетов, если купить на нижнее место взрослый билет, на верхнее – детский.

Взрослый билет – 3000 руб.

Детский 40% от полной стоимости билета на верхнее место, то есть от 2000 руб.

2000 руб. – 100%

х руб. – 40%

displaystyle        x=frac{2000cdot40%}{100%} =800   (руб.)

Вся покупка будет стоить

3000 + 800 = 3800 (руб.)

2. Теперь рассчитаем стоимость билетов, если купить на верхнее место взрослый билет, на нижнее – детский.

Взрослый билет – 2000 руб.

Детский 40% от полной стоимости билета на нижнее место, то есть от 3000 руб.

3000 руб. – 100%

х руб. – 40%

displaystyle        x=frac{3000cdot40%}{100%} =1200   (руб.)

Вся покупка будет стоить

2000 + 1200 = 3200 (руб)

Следовательно, минимальная стоимость билетов 3200 руб.

Добавить комментарий