Poniższy kod generuje werdykt przekroczony limit czasu. Czy można przyśpieszyć poniższy kod, czy konieczne będzie inne rozwiązanie?
`Scanner in = new Scanner(System.in);
int w = in.nextInt();
int k = in.nextInt();
int[] values = new int[w*k];
for(int i=0;i<w*k;i++){
values[i]=in.nextInt();
}
for(int i=0;i<k;i++){
for(int j=0;j<w;j++){
System.out.print(values[i+j*k] + " ");
}
System.out.println();
}`
Możesz spróbować wyprowadzić dane poprzez StringBuilder, ale podejrzewam, że sama zmiana wyjścia nie wystarczy. Na wejściu można spróbować wczytać wszystkie dane do stringa i samemu potem go pociąć.
Zdecydowanie łatwiej przejść na C/C++
Hej, nie mogę znaleźć błędu. SPOJ informuje mnie o (SIGABRT) ale nie wiem gdzie to mogę to poprawić.
KOD c++:
#include <iostream>
using namespace std;
int n, m, liczba;
int main()
{
cin >> m >> n;
int tab[m + 1][n+1];
for(int j=1; j<=m; j++)
{
for(int i=1; i<=n; i++)
{
cin>>liczba;
tab[i][j]=liczba;
}
}
for(int j=1; j<=n; j++)
{
for(int i=1; i<=m; i++)
{
if(i<m)
{
cout<<tab[j][i]<<" ";
}
else
{
cout<<tab[j][i];
}
}
if(j<n) cout<<endl;
}
for (int i = 0; i<m; i++)
{
delete[] tab[i];
}
delete[] tab;
return 0;
}
Cześć,
zawsze jak piszesz posta to możesz zaznaczyć kod i zobaczyć co robią te guziczki u góry, np </> sformatuje Ci kod.
To:
int tab[m + 1][n+1];
nie jest prawidłowa deklaracja tablicy o wielkości nie znanej podczas kompilacji. Powinieneś uzyć new[] lub vektora. Ale w gcc zazwyczaj działa mimo, że ta składnia nie jest częścią jezyka
Za to jak wykonasz delete na czymś czego nie tworzyłeś za pomocą słowa new to wtedy zazwyczaj dostaniesz bład i to właśnie prawdopodobnie SIGABRT.
A tak w ogóle to delete Ci się raczej na spoju nie przyda, ale w bardzo małym odsetku zadań. A niech sobie sędzia sam z pamięcią radzi
-
Czytamy komunikaty błędów i warningi. Drugie można zignorować (podobnie jak errory - w końcu jesteś wolnym człowiekiem i nie musisz ograniczać się do kompilujących, działających kodów
), ale na ogół sugerują jakiś błąd, który wyjdzie przy wykonywaniu kodu.
main.cpp: In function ‘int main()’:
main.cpp:37:23: warning: deleting array 'tab[i]'
delete[] tab[i];
^
main.cpp:39:14: warning: deleting array 'tab’
delete[] tab;
^ -
Co do:
Nie, nie powinieneś użyć vector - najpierw naucz się tablic a potem vector
-
Jak słusznie zauważył @j4rooo:
Skoro już wiesz, że gcc/g++ to jedno, a C/C++ to drugie, możesz się zastanawiać, jak to ze sobą połączyć
Użycie --pedantic od razu daje dodatkowe ostrzeżenia
main.cpp:8:23: warning: ISO C++ forbids variable length array ‘tab’ [-Wvla]
int tab[m + 1][n+1];
^
main.cpp:8:23: warning: ISO C++ forbids variable length array ‘tab’ [-Wvla]
main.cpp:37:23: warning: deleting array 'tab[i]'
delete[] tab[i];
^
main.cpp:39:14: warning: deleting array 'tab’
delete[] tab;
^Oczywiście w praktyce cwane sztuczki z użyciem komplikatorów życia mogą mieć uzasadnienie, natomiast na SPOJu radzę traktować kodzenie jak sztukę - pisać kody zgodne z powszechnie obowiązującymi standardami.
-
A na koniec:
Prawda, dotyczy to także destruktorów, natomiast na razie niech Ci się to przydaje - jak będziesz umiał tego użyć to potem świadomie, w pełni rozumiejąc konsekwencje swoich poczynań, możesz kombinować
Niby odpowiedzi wychodzą git, ale sędzia mówi, że naruszenie pamięci. Ktoś ma pomysł gdzie to może być?
#include <iostream>
#include <vector>
using namespace std;
void wpisz(vector<vector<int> > & tab)
{
for(int n=0 ; n<tab.size() ; n++)
{
for(int m=0 ; m<tab[n].size() ; m++)
{
int a;
cin>>a;
tab[m][n]=a;
}
;
}
}
void pokaz(vector<vector<int> >& tab)
{
for(int m=0 ; m<tab[m].size() ; m++)
{
for(int n=0 ; n<tab.size() ; n++)
{
cout<<tab[m][n];
}
cout<<endl;
}
}
int main()
{
int m,n;
cin>>m>>n;
vector<vector<int> >tab (n,vector<int>(m));
wpisz(tab);
pokaz(tab);
return 0;
}
Zrobiłem od nowa ten kodzik i fajnie, bo nie ma błędu pamięci. W zamian błąd odpowiedzi. Na ideone.com5 odpowiedź się zgadza. Może problem w tych spacjach albo endlach? W sumie sam już nw.
#include <iostream>
#include <vector>
using namespace std;
void wpisz(vector<vector<int> > & tab)
{
for(int m=0 ; m<tab.size() ; m++)
{
for(int n=0 ; n<tab[m].size() ; n++)
{
cin>>tab[m][n];
}
cout<<endl;
}
}
void poka(vector<vector<int> >& tab)
{
for(int m=0 ; m<tab[m].size() ; m++)
{
for(int n=0; n<tab.size(); n++)
{
cout<<tab[n][m]<<" ";
}
cout<<endl;
}
}
int main()
{
int m,n;
cin>>m>>n;
cout<<endl;
vector<vector<int> >tab (m,vector<int>(n));
if(m>0 and n>0 and m<201 and n<201)
{
wpisz(tab);
poka(tab);
}
return 0;
}
Ciekawostka, albo i nie,
próbowałem, napisałem w Javie i ciągle wyskakuje mi błąd błędna odpowiedź
to mój kod
skopiowałem od kogoś z innego wątku kod który tej osobie dawał przekroczony limit czasu.
( według mnie u mnie dla kilku testów te sasme wyniki)
wleiłem kod tego Pana licząc na przekroczony limit czasu, ale jednak wyrobił się w czasie i jest zielone! kod tego Pana,
Pytanie czy ktoś widzi czemu ja mogę mieć błedną odpowiedź?
#edit kody usunąłem, podpowiedź Użytkownika narbej bardzo mi pomogła.