crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Вода между стен, забавный тест от программистов твиттера
Iron Bug
  опции профиля:
сообщение 7.5.2014, 21:46
Сообщение #1


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Попалась тут забавная задачка :)
Задача:
http://qandwhat.apps.runkite.com/i-failed-...tter-interview/
Дя тех, кто не очень хорошо понимает по-английски, задача вкратце:
Представлен последовательный набор чисел. Числа указывают "высоту стен", стоящих рядом. Задача: посчитать количество воды, которая может накопиться в таком резервуаре, если пройдёт дождь. Вода через низкие препятствия утекает, как и полагается воде. С краёв она тоже утекает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Влад
  опции профиля:
сообщение 16.5.2014, 12:14
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Коллеги, а вы обратили внимание, что в точном соответствии с буквой оригинального условия задачи "высота" стенок может быть и отрицательной? Почему бы не протестировать и на последовательностях вида { 3, -1, -2, 8, -3, -1, 2, 0, -3 } ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 16.5.2014, 17:16
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Влад @ 16.5.2014, 15:14) *
Коллеги, а вы обратили внимание, что в точном соответствии с буквой оригинального условия задачи "высота" стенок может быть и отрицательной? Почему бы не протестировать и на последовательностях вида { 3, -1, -2, 8, -3, -1, 2, 0, -3 } ?

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

поправила мелкий косячок в своём коде. а так, он и с отрицательными значениями работает: потому что всё равно сначала "выравнивает" минимальные значения на ноль.

на самом деле, можно ещё оптимизировать маленько, сразу отрезав "скаты" по краям:
Раскрывающийся текст
#include <iostream>
#include <vector>

using namespace std;

typedef struct _data
{
    int level;
    int weight;
    _data(int h,int w) : level(h), weight(w) {}
}
data;

int calcVolume(int count, int *x)
{

    if (count<3) return 0;

    int start = count-1;
    for(int i=0;i<count-1; i++)
    {
        if(x[i]>x[i+1])
        {
            start = i;
            break;
        }
    }
    int stop = 0;
    for(int i=count-1;i>0; i--)
    {
        if(x[i]>x[i-1])
        {
            stop = i;
            break;
        }
    }

    vector<data> v;
    int x_min = x[start];
    int current_level = x[start];
    int current_weight = 1;

    for(int i=start;i<=stop;i++)
    {
        if(x[i]<x_min) x_min = x[i];
        if(x[i]!=current_level)
        {
            v.push_back(data(current_level,current_weight));
            current_level = x[i];
            current_weight = 1;
        }
        else
        {
            current_weight++;
        }
     }
     v.push_back(data(current_level,current_weight));

    size_t size = v.size();
    for(size_t i=0; i<size; i++)
    {
        v[i].level-=x_min;
    }

    int volume = 0;
    vector<data> v_new;

    while(size>2)
    {
        for(size_t i=0; i<size; i++)
        {
            cout << v[i].level << "(" << v[i].weight << "), ";
        }
        cout << endl;

        current_level = v[0].level;
        current_weight = v[0].weight;
        for(size_t i=1; i<size; i++)
        {
            if(i != size-1)
            {
                if((v[i].level==0)&&(v[i-1].level>0)&&(v[i+1].level>0))
                {
                    volume += v[i].weight;
                    v[i].level += 1;
                }
            }
            if(v[i].level != current_level)
            {
                if(current_level>0)
                {
                    v_new.push_back(data(current_level-1,current_weight));
                }
                current_level = v[i].level;
                current_weight = v[i].weight;
            }
            else
            {
                current_weight += v[i].weight;
            }
        }
        if(current_level>0)
        {
            v_new.push_back(data(current_level-1,current_weight));
        }
        v = v_new;
        size = v.size();
        v_new.clear();
    }
    return volume;
}

int main()
{
    int x[] = {   3, -1, -2, 8, -3, -1, 2, 0, -3  };
    cout << "Volume is " << calcVolume(sizeof(x)/sizeof(int),x) << endl;
    return 0;
}



update: ещё маленько добавила проверку - для пущей оптимальности.

Сообщение отредактировал Iron Bug - 19.5.2014, 19:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Iron Bug   Вода между стен   7.5.2014, 21:46
- - ilyabvt   Решил так: Раскрывающийся текстint calcWaterVolume...   8.5.2014, 20:13
- - Iron Bug   а как насчёт последовательностей типа { 3, 1, 2, 1...   8.5.2014, 20:28
- - ilyabvt   Цитатаа как насчёт последовательностей типа { 3, 1...   8.5.2014, 20:40
|- - Iron Bug   Цитата(ilyabvt @ 8.5.2014, 23:40) Цитатаа...   15.5.2014, 20:58
- - Алексей1153   просканировать стенки, начиная снизу, интегрироват...   12.5.2014, 8:11
- - Iron Bug   у меня идея в том, чтобы "срезать" нижни...   15.5.2014, 22:24
- - Влад   Коллеги, а вы обратили внимание, что в точном соот...   16.5.2014, 12:14
|- - Iron Bug   Цитата(Влад @ 16.5.2014, 15:14) Коллеги, ...   16.5.2014, 17:16
- - Алексей1153   я щас глянул - исправил у себя явный глюк - вместо...   18.5.2014, 11:28
|- - Iron Bug   Цитата(Алексей1153 @ 18.5.2014, 14:28) Ir...   19.5.2014, 19:31
- - ilyabvt   Цитатаа для { 3, 1, 2, 1, 4, 1, 2, 1, 4 } неправил...   18.5.2014, 18:40
|- - Iron Bug   Цитата(ilyabvt @ 18.5.2014, 21:40) Обнови...   19.5.2014, 20:07
- - Алексей1153   Iron Bug, наверное, в самом городе из-за зданий не...   20.5.2014, 6:53
- - Алексей1153   ещё оптимизация для муравья - ему не обязательно с...   20.5.2014, 7:47
- - ilyabvt   Цитата(Iron Bug @ 19.5.2014, 23:07) Цитат...   20.5.2014, 18:24


Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 23:10