Как стереть элемент в векторе вектора или матрицы

#c

Вопрос:

Привет, я пытаюсь стереть элемент в векторе вектора/, скорее всего, матрицу из вектора, поэтому я искал переполнение стека, но у него не было ответов, и я не смог найти его в Интернете, поэтому подумал спросить здесь.Ну, я новичок в программировании и пытаюсь решить раунд Google kick start 2020-ВОПРОС.

Итак, я написал код, который действует аналогично стеку, но я не использовал стек, но пытался реализовать его с помощью вектора, но не смог стереть элемент в i-й и n-й позиции.

код

 #include <iostream>
#include <vector>
#include <algorithm>
#define ans(x,y) "Case #"<<x<<": "<<y<<"n"
using namespace std;
int main(int argc, char *argv[])
{
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    int TC;
    cin>>TC;
    int k=1;
    while(TC--){
        int Stacks,Plates,Max;
        cin>>Stacks>>Plates>>Max;
        vector<vector<int>>S_Plates;
        for(int i=0;i<Stacks;i  ){
            vector<int>vec;
            for(int j=0;j<Plates;j  ){
                int Dat;
                cin>>Dat;
                vec.push_back(Dat);
            }
            S_Plates.push_back(vec);
        }
        int Cnt=0,Beauty=0;
        while(Cnt!=Plates){
            int mx=0;
            int SNo=0;
            for(int i=0;i<Stacks;i  ){
                mx=(mx,S_Plates[i][0]);
                if(mx==S_Plates[i][0])
                    SNo=i;
            }
            Beauty =(mx);
        // Well Got Stucked Here    S_Plates.erase(S_Plates.begin() SNo[0]);
            Cnt  ;
        }
        cout<<ans(k,Beauty);
        k  ;
    }
}
 

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

Поэтому, пожалуйста, дайте мне знать, как я могу это сделать.

PS: Извините за плохой английский И Плохой Код

Комментарии:

1. что не так с кодом? Что происходит, когда у вас есть S_Plates.erase(S_Plates.begin() SNo[0]); в коде? Ошибка компилятора? Ошибка во время выполнения? Неожиданный результат?

2. SNo является ан int . Какое у вас было намерение, когда вы писали SNo[0] ?

3. Ну, S_Plates-это вектор, и каждый индекс имеет свой вектор внутри него, SNo-это i-й индекс, к которому я хочу получить доступ, и когда я пытаюсь получить доступ к 0-му элементу i-го вектора, как вы знаете, значение, указанное в подписке, не является массивом, указателем или вектором

4. @largest_prime_is_463035818 мое намерение состояло в том, чтобы получить доступ к 0-му элементу i-го вектора, но я не знаю, как это сделать

5. это, вероятно, еще одна опечатка: mx=(mx,S_Plates[i][0]); . Вы хотели получить максимум из двух или что-то в этом роде? Как написано, это то же самое, mx = S_Plates[i][0]; что делает условие в следующей строке true всегда

Ответ №1:

Стирание может быть выполнено следующим образом:

 S_Plates[SNo].erase(S_Plates[SNo].begin());
 

Как указано в комментариях, в других местах необходимо внести несколько изменений.

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

Однако этот жадный алгоритм не дает хорошего результата. Например, рассмотрим

 Stacks (N) = 3; Plates (K) = 2; Max (P) = 2; 
S[0] = {1, 100}, S[1]={2, 2}, S[2] = {2, 2}
 

Ваша программа возвращает 4 вместо 101.

Решение заключается в реализации алгоритма DP.

Давайте определим массив Cumul[N][P] , инициализированный 0.

Затем

 i = 0 to N-2
Cumul[i 1][j] = max (Cumul[i][j], Cumul[i][j-k], A[i][0]   .. A[i][k-1]), for j =0 to P and k = 0 to K
 

Сложность равна O(PNK).