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/
Дя тех, кто не очень хорошо понимает по-английски, задача вкратце:
Представлен последовательный набор чисел. Числа указывают "высоту стен", стоящих рядом. Задача: посчитать количество воды, которая может накопиться в таком резервуаре, если пройдёт дождь. Вода через низкие препятствия утекает, как и полагается воде. С краёв она тоже утекает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 15.5.2014, 22:24
Сообщение #2


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

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

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




Репутация:   12  


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

Раскрывающийся текст
#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;

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

    for(int i=1;i<count;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)
            {
                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, 1, 4, 1, 2, 1, 4 };
    cout << "Volume is " << calcVolume(sizeof(x)/sizeof(int),x) << endl;
    return 0;
}


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

Сообщений в этой теме
- 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


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


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




RSS Текстовая версия Сейчас: 28.11.2024, 5:11