Как написать динамику к задаче, чтобы работала быстрее?

285
11 декабря 2017, 13:02

мой код:

#include <iostream>;
#include <vector>;
#include <algorithm>;
#include <stdio.h>;
#include <string>;
#include <sstream>;
#include <cstring>;
using namespace std;

struct Info
{
    int s, h, w, fs, fh, fw, sum, id;
};
char Check(vector<Info> a, int i);

int main() {
    int n, m, k;
    vector<int> vlad;
    vector<Info> priziv;
    vector<string> otvet;
    cin >> n >> m >> k;
    char str[] = "";
        for (int i = 0; i < n;i++) {
            int c;
            for(int j =0; j < 6;j++)
            {
                cin >> c;
                vlad.push_back(c);
            }
            Info priz;
            priz.s = vlad[0];
            priz.h = vlad[1];
            priz.w = vlad[2];
            priz.fs = vlad[3];
            priz.fh = vlad[4];
            priz.fw = vlad[5];
            priz.id = i + 1;
            priz.sum = max(priz.s, priz.fs) + max(priz.h , priz.fh) + max(priz.w,priz.fw);
            priziv.push_back(priz);
            vlad.clear();
        }
        sort(priziv.begin(), priziv.end(), [](const Info& a, const Info& b) {
            return a.sum > b.sum;
        });
        int id = 0;
        int count = 0;
        while (k != 0 && id != priziv.size()) {
            while (Check(priziv, id) != '.')
            {
                if (k != 0 && Check(priziv, id) == 's')
                {
                    priziv[id].s = priziv[id].fs;
                    priziv[id].fs = 0;
                    string str = to_string(priziv[id].id);
                    string otv = "";
                    string klass = " STRENGTH";
                    otv += str;
                    otv += klass;
                    otvet.push_back(otv);
                    k--;
                    count++;
                }
                else if (k != 0 && Check(priziv, id) == 'h')
                {
                    priziv[id].h = priziv[id].fh;
                    priziv[id].fh = 0;
                    string str = to_string(priziv[id].id);
                    string otv = "";
                    string klass = " HEIGHT";
                    otv += str;
                    otv += klass;
                    otvet.push_back(otv);
                    k--;
                    count++;
                }
                else if (k != 0 && Check(priziv, id) == 'w')
                {
                    priziv[id].w = priziv[id].fw;
                    priziv[id].fw = 0;
                    string str = to_string(priziv[id].id);
                    string otv = "";
                    string klass = " WEIGHT";
                    otv += str;
                    otv += klass;
                    otvet.push_back(otv);
                    k--;
                    count++;
                }
            }
            if (id == m) break;
            id++;
        }
        for (int i = 0; i < n;i++) {
            priziv[i].sum = priziv[i].s + priziv[i].h + priziv[i].w;
        }
        sort(priziv.begin(), priziv.end(), [](const Info& a, const Info& b) {
            return a.sum > b.sum;
        });
        int summer = 0;
        for (int i = 0; i < m; i++)
        {
            summer += priziv[i].sum;
            vlad.push_back(priziv[i].id);
        }
        std::cout << summer << " ";
        std::cout << count << "\n";
        for (int i = 0; i < otvet.size();i++) {
            std::cout << otvet[i] << "\n";
        }
        sort(vlad.rbegin(), vlad.rend());
        for (int i = vlad.size() - 1; i >= 0;i--) {
            std::cout << vlad[i] << " ";
        }
}
char Check(vector<Info> a, int i)
{
    int m1 = 0, m2 = 0, m3 = 0;
    if (a[i].fs > a[i].s) m1 = a[i].fs - a[i].s;
    if (a[i].fh > a[i].h) m2 = a[i].fh - a[i].h;
    if (a[i].fw > a[i].w) m3 = a[i].fw - a[i].w;
    if (m1 != 0 || m2 != 0 || m3 != 0)
    {
        int max1 = max(m1, m2), max2 = max(m2, m3);
        int max3 = max(max1, max2);
        if (m1 == max3)
        {
            return 's';
        }
        else if (m2 == max3)
        {
            return 'h';
        }
        else if (m3 == max3)
        {
            return 'w';
        }
        else
        {
            return '.';
        }
    }
    else
    {
        return '.';
    }
}

работает верно, но валится на больших тестах помогите разобраться!

Answer 1

Самое простое - чуть подправить сигнатуру функции Check:

char Check(const vector<Info>& a, int i);

Тогда вектор не будет копироваться при каждом вызове. Ну и вызывать Check 1 зраз за цикл, сохранив результат и используя его в последующих сравнениях:

char c = ' ';
while ('.' != c = Check(priziv, id)) {
    if (k != 0 && c == 's') {
READ ALSO
Приём платежей от пользователей

Приём платежей от пользователей

Всем приветВозможнго, это вопрос не по шарпам, но так как пишу приложение на #, оставлю это здесь

224
Привязать фигуру к курсору, при клике отрисовать в pictureBox

Привязать фигуру к курсору, при клике отрисовать в pictureBox

Всем доброго времени суток, имеется форма на ней pictureBox1 и пара textBox, на pictureBox'е отрисовывается помещение, как можно взять значение из textBox'ов,...

225
Хранение введённых пользователем данных

Хранение введённых пользователем данных

Здравствуйте, вопрос заключается в следующем: как можно сохранять данные, введенные пользователем, не используя БД или их запись в файл? При...

242
Можно ли узнать цвет пикселя в PictureBox без Bitmap?

Можно ли узнать цвет пикселя в PictureBox без Bitmap?

Собственно весь вопрос в заголовке

194