#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).