Aktív témák
-
gabesz82
őstag
Sziasztok!
Lenne egy feladat amit meg kellene oldanom C++-ban!
A feladat a következő:
Egy konkrét értékre futási időben kiszámitja az (a + b)^n polinom m. együtthatóját.
(template meta programozással kell megoldani), szóval aki tud valamit segíteni, légyszi írjon, köszi... -
clayman
aktív tag
http://authors.aspalliance.com/aylar/ViewPasteCode.aspx?PasteCodeID=3552
Bővebben: link
ellenőrizd le, remélem jó de nagyon gyorsan dobtam össze -
clayman
aktív tag
mindenesetre a kész program:
#include <stdio.h>
#include <malloc.h>
void main()
{
unsigned int N;
unsigned int S;
unsigned int* X;
FILE* fInput, *fOutput;
unsigned int j;
unsigned int voltCsere=1;
fInput=fopen(''input.txt'', ''rt'');
fOutput=fopen(''output.txt'', ''wt'');
fscanf(fInput, ''%d\n'', &N );
X=(unsigned int*)calloc(N, sizeof(int));
for(j=0;j<N;++j) {
fscanf(fInput, ''%d'', X+j );
}
// sorbarendezés
// ******************
while(voltCsere)
{
unsigned int k;
voltCsere=0;
for(k=0;k<(N-1);++k)
{
if(X[k]<X[k+1])
{
int Z=X[k];
X[k]=X[k+1];
X[k+1]=Z;
voltCsere=1;
}
}
}
// ******************
while(1)
{
int bElso=1;
fscanf(fInput, ''%d\n'', &S );
if(S==0) break;
fprintf(fOutput, ''%d:'', S);
for(j=0;j<N;++j ) {
unsigned int y=0;
while(S>=X[j]) {
y++; S-=X[j];
}
if(y) {
if( bElso ) {
fprintf(fOutput, '' %ddb %d'', y, X[j]);
bElso=0;
} else {
fprintf(fOutput, '', %ddb %d'', y, X[j]);
}
}
}
fprintf(fOutput, ''\n'');
}
free(X);
} -
Protezis
őstag
Ha egy tömbben vannak eltárolva a címletek, akkor cserével lehet megcsinálni. Tehát 2 egymásba ágyazott for ciklus.
A lényeg: 1. címletet összehasonlítod 2.-kal, ha nagyobb, csere, majd 3.-kal, ha nagyobb, csere, végig
majd 2. címletet 3.-kal, -II-
for (k=0; k<=n; k++) {
for (j=k+1; j<=n; j++) {
if (cimlet[k]>cimlet[j]) {
csere(paraméterek);
}
}
} -
Protezis
őstag
Kipróbáltam long int-tel, és úgy se jó
Nah mindegy, a suliban gcc-vel fordítják le a köprogimat, szóval tuti jó lesz.
Ha meg nem, elbeszélgetek a gyakvezéremmel -
-
Protezis
őstag
válasz
KovacsUr #124 üzenetére
Architektúrafüggő?
Az int a linuxos gcc-ben:
-2147483647-től 2147483647-ig tart.
BC-ben egy a watcommal pedig túlcsordult 35k-nál.
gcc-vel lefordítottam, és jól működik. Nem architektúrafüggő, hanem fordítófüggő szvsz. Persze én se értem miért így van.
Adj össze két számot, úgy, hogy az eredmény mondjuk 40000 legyen, és fordítsd le BC-vel.
Architektúra: ugyanazt az x86-os gépet használtam!
[Szerkesztve] -
-
Protezis
őstag
Fontos!
Bár úgy tanultam, hogy az int típus nagyon-nagyon sok (2xxxxxxxxxxxx, nem tudom), de a programom futása során észrevettem, hogy csak 32768 a max, mivel utána túlcsordult, és két poz. szám összegére negatívot adott. Mindezt a watcommal, később a Borland C-vel is megcsináltam. Végül kipróbáltam a mingwvel, és azzal jó!
Szóval én is ennek a használatát javaslom. -
VladimirR
nagyúr
vagy hasznalj cygwin-t (pontosan nem tudom, de ugy remlik, hogy ezzel tudsz linuxot emulalni win alatt) Bővebben: link
[Szerkesztve] -
VladimirR
nagyúr
gugli ezt talalta: Bővebben: link
-
_Petya_
őstag
Üdv!
Ingyenes, windows-os C fordítót, vagy fejlesztőkörnyezetet keresek. Lehetőleg legyen kompatibilis a linuxos gcc-vel. Tud valaki linket adni?
Petya -
clayman
aktív tag
ahogy elnézem a 20. sorban nincs deklarálva a 'true' sima Cben, értéke = 1 a legegyszerűbb ha átírod
vagy az includok után beteszel 1 olyat hogy
#define true 1
[Szerkesztve] -
clayman
aktív tag
No, remélem ez C lett és semmilyen C++ kiterjesztést nem tartalmaz ;)
itt találod:
http://authors.aspalliance.com/aylar/ViewPasteCode.aspx?PasteCodeID=3520
Bővebben: link -
clayman
aktív tag
ha c akkor legyen c
-
clayman
aktív tag
Hail!
Sztem az algorithmusodnak a kiindulópontja lehet az a bizonyos:
A felváltásnál a nagyobb címleteket részesíti előnyben tagmondat.
algorithmus
legyen S összeg, N féle címlet, X[0..N-1] a címletek értékei és Y[0..N-1] h egyes címletekből hány darab kell
ekkor
main() {
unsigned int N;
// beolvasod N-t
unsigned int* X=new int[N];
unsigned int* Y=new int[N];
// valahol errefele beolvasod a címleteket
unsigned int S;
while(true)
{
// s beolvasása
if(S==0) break;
for( int j=0;j<N;++j ) Y[j]=0;
for( int i=0;i<N;++i ) {
while(S>=X) {
Y++; S-=X;
}
}
// kiirod Y tömb tartalmát
}
delete [] X;
delete [] Y;
} -
Dfg
csendes tag
Sziasztok!
Erre a feladatra keresek megoldást
Tudtok segíteni?
A program először bekéri, hogy hány címlet van (maximum N), azután bekéri a
címletek értékeit. Végül pedig a 0 végjelig sorban bekéri a felváltani
kívánt összegeket, és kiírja, hogy melyik címletből hány darab kell a
felváltásukhoz. Az inputot a be.txt fájlból kell olvasni! A felváltásnál a
nagyobb címleteket részesíti előnyben, és feltételezhető, hogy az összegek
maradék nélkül felválthatók a megadott címletekkel. A kiírásnál csak azokat
a címleteket írja ki, amikből legalább 1 darab kell. Az outputot a ki.txt
fájlba kell írni!
Példa input:
14
20000 10000 5000 2000 1000 500 200 100 50 20 10 5 2 1
28572
5424
0
Példa output:
28572: 1db 20000, 1db 5000, 1db 2000, 1db 1000, 1db 500, 1db 50, 1db 20, 1db 2
5424: 1db 5000, 2db 200, 1db 20, 2db 2
A Pascal-t elég jól értem, de a C-hez láma vagyok.. -
b14
senior tag
válasz
TrollBalint #98 üzenetére
Hello
Valoszinuleg hulyen magyaraztam el, mert azt akartam volna, hogy amikor megnyomok egy gombot, akkor fusson le ujbol, es addig ne, az egesz vegtelen ciklus legyen. -
VladimirR
nagyúr
a te megoldasoddal az a gond, hogy igy vagy mindig tovabblep, vagy soha, da a pufferhez hozza nem nyul
#include <stdio.h>
#include <conio.h>
void main (void) {
int szam, i;
char ch;
do {
clrscr();
printf(''Szam: '');
while (kbhit()) {
getch();
}
scanf(''%d'',&szam);
for (i=szam; i>0; i--) {
if (szam % i == 0 ) {
printf (''%d * %d \n'',szam/i,i );
}
}
printf(''Kilepeshez uss ESC-et'');
ch = getch();
} while (ch != 27);
} -
b14
senior tag
válasz
VladimirR #96 üzenetére
Hello
Megprobaltam, de nem az a baja.
Valaki megnezne a kodot?
A gotot, meg ilyeneket, kerem nem felvetni,mert azt tudom, hogy buntetendo.
#include <stdio.h>
#include <conio.h>
main ()
{
int l, szam, i;
eleje: clrscr();
printf(''Szam: '');
scanf(''%d'',&szam);
while (i>0)
{
if (szam % i == 0 )
{
printf (''%d * %d \n'',szam/i,i );
}
i--;
}
flushall();
while(!kbhit());
goto eleje;
return 0;
} -
b14
senior tag
válasz
TrollBalint #93 üzenetére
Nem, c rol lenne szo, abban kellene a megoldas, es az kellene, hogy addig varjon, mig nem nyomok egy gombot, es az elso az siman megy, de mar masodjara , tobbedikre csak atugorja
-
TrollBalint
addikt
ha jól értelmezem ez C, ugye? mert láttam itt többnyelvet is hirtelen a topicban..
Ha jól emlékszem (de rég is tanultam c-t...) akkor amit te irtál az azt jelent, hogy csináld addig amig nem nyomsz le egy billentyüt, ezért ugrik tovább rajta simán...
Aztán javitsok ki valaki ha rosszul emlékszem és hülyeséget mondtam -
b14
senior tag
Hi
Gyors segitsegre lenne szuksegem
van egy program, ami osztokat szamol, de ez lenyegtelen. mindig visszater az elejrere, de elotte tettem egy while(!kbhit()) goto eleje, de itt meg nincs gond, hanem ott, hogy csak siman tovabbugrik rajta, mikor oda kerul a sor, szerintem a bill. puffert kene uriteni, de lehet, hogy nem. Surgos -
gabesz82
őstag
Tényleg rettentő ötletes és profi az algoritmus... eddig még nem sikerült kifogni rajta, kb 120-130 inputra néztem meg és mindre jó volt... Szóval tényleg nagyon frankó kis algoritmus... Köszönöm szépen Heihachi és Szsolt... vagy Szsolt és Heihachi... mindegy melyik sorrendet írom, mert mindketten rengeteget segítettetek...
[Szerkesztve] -
Szsolt
tag
Elemeztem 1 kicsit a kódodat...vérprofi
Különösen ez a részlet tetszett:
for t := n downto 1 do begin
aktualisa := a[t];
maxsorhossz := 0;
for j := t to n do begin
if a[j] >= aktualisa then begin
if b[j]+1 > maxsorhossz then maxsorhossz := b[j]+1;
end;
end;
b[t] := maxsorhossz;
end;
Amilyen eccerű, olyan nehezen jöttem volna rá. (ha persze egyáltalán rájöttem volna)
-
majdnem
csendes tag
Egy ''majdnem'' c megoldas (c++). Az adatbeviteli es kiiro resz nincs kidolgozva. Remelem meg aktualis. Biztosan jo
#include <iostream>
using namespace std;
int main(){
//adatok beolvasasa
const int n = 6;
int tomb[n+1] = {0, 12, 2, 11, 4, 10, 7};
//ket segedtomb feltoltese
int kov[n+1], hossz[n+1];
for(int i=0; i<=n; i++){
kov = -1; hossz = 0;
}
// lenyeg
for(int i=n-1; i>=0; i--){
for(int j=i+1; j<=n; j++){
if(tomb<=tomb[j] && hossz<=hossz[j]){
hossz = hossz[j]+1;
kov = j;
}
}
}
//eredmenyek kiirasa
cout << hossz[0] << endl;
int kovind = kov[0];
while(kovind!=-1){
cout << kovind << '' '';
kovind = kov[kovind];
}
}
Ha kell magyarazat is szoljatok.
[MOD] HTLM elcseszte a tordelest....
[Szerkesztve] -
Szsolt
tag
Mér nem tanulsz meg C-ül?
Eleinte én is Pascallal nyomultam, és mikor C-t kezdtem el tanulni, még undorom volt..., de mára szvsz a C a legjobb eljárás-orientált nyelv, és azt szeretem benne, hogy kib@szott rövid kódokat lehet vele írni.
(pl. ami Pascalban 10 sor az C-ben 3-4 sorba össze lehet zsúfolni) -
heihachi
addikt
Ez majdnem jó, de a kiíratásnál hibáztam
. Mostmár végigpróbáltam a topik összes példájára és műxik. Ha ez is hibás, akkor akkor jön a v3
Tehát helyesen:
program phv21;
uses
crt;
const
n = 10;
var
t, j, maxsorhossz : byte;
a,b : array[1..n] of integer;
aktualisa : integer;
maxsorhosszb, maxhozindexb, aktualisindexa : byte;
begin
clrscr;
a[1] := 5;
a[2] := 5;
a[3] := 1;
a[4] := 6;
a[5] := 6;
a[6] := 5;
a[7] := 4;
a[8] := 4;
a[9] := 6;
a[10] := 8;
for t := n downto 1 do begin
aktualisa := a[t];
maxsorhossz := 0;
for j := t to n do begin
if a[j] >= aktualisa then begin
if b[j]+1 > maxsorhossz then maxsorhossz := b[j]+1;
end;
end;
b[t] := maxsorhossz;
end;
maxsorhosszb := 0;
maxhozindexb := 0;
for t := 1 to n do begin
if b[t] >= maxsorhosszb then begin
maxhozindexb := t;
maxsorhosszb := b[t];
end;
end;
aktualisa := a[maxhozindexb];
aktualisindexa := maxhozindexb;
for t := aktualisindexa to n do begin
if (a[t] >= aktualisa) and ((b[t] = b[aktualisindexa]-1) or (b[t] = b[aktualisindexa])) then begin
aktualisa := a[t];
aktualisindexa := t;
write(' ',t,' ');
end;
end;
readln;
end. -
ext
csendes tag
megérzésem szerint az optimális megoldás n-el arányos,
azaz a tömb egyszeri (!) végigolvasásával meg lehet oldani... -
heihachi
addikt
Nos, átgondoltam az egészet, és teljesen más koncepcióval álltam elő.
Egyszerűbb lett, gyorsabb, rövidebb. Meg szerintem jó is, de még tesztelem...
Ezt TP7-alá írtam, hátha nincs mindenkinek Delphije
program phv2;
uses
crt;
const
n = 10;
var
t, j, maxsorhossz : byte;
a,b : array[1..n] of integer;
aktualisa : integer;
maxsorhosszb, maxhozindexb : byte;
begin
clrscr;
a[1] := 5;
a[2] := 5;
a[3] := 1;
a[4] := 6;
a[5] := 6;
a[6] := 5;
a[7] := 4;
a[8] := 4;
a[9] := 6;
a[10] := 8;
b[1] := 0;
b[2] := 0;
b[3] := 0;
b[4] := 0;
b[1] := 0;
b[1] := 0;
b[1] := 0;
b[1] := 0;
b[1] := 0;
b[1] := 0;
for t := n downto 1 do begin
aktualisa := a[t];
maxsorhossz := 0;
for j := t to n do begin
if a[j] >= aktualisa then begin
if b[j]+1 > maxsorhossz then maxsorhossz := b[j]+1;
end;
end;
b[t] := maxsorhossz;
end;
maxsorhosszb := 0;
maxhozindexb := 0;
for t := 1 to n do begin
if b[t] >= maxsorhosszb then begin
maxhozindexb := t;
maxsorhosszb := b[t];
end;
end;
aktualisa := 0;
for t := maxhozindexb to n do begin
if a[t] >= aktualisa then begin
aktualisa := a[t];
write(' ',t,' ');
end;
end;
readln;
end. -
gabesz82
őstag
Hát még így sem teljesen jó, mert (nem kukacoskodni akarok,csak...):
bemenet:
5 5 1 6 6 5 4 4 6 8
erre kimenetnek ezt adja:
3 7 8 9 10
ami ugye nem jó, mert van hosszabb
1 2 4 5 9 10
De egyébként az összes többi inputra legalábbis amikre leellenőriztem helyes volt a progi, csak erre az egyre nem ad jó eredményt... Valami ötlet?? -
corm
senior tag
Bocsánat, hogy belepofátlankodok a topicba, de nem akartam újat nyitni. Nekem csak egy egyszerű c++ kérdésem lenne: hogy használjuk és mire jó pontosan a copy konstruktor. Thx a válaszokat
-
heihachi
addikt
OK, ezt félreértettem...
Igazán nem kukacoskodni akarok, vagy védeni a saját megoldásomat, de:
''majd megnezzuk, hogy negytol mekkora a leghosszabb novekvo sorozat ''
Szóval ez a mondat itt a lényeg! Hogyan lehet a meghatározni a leghosszabb növekvő sorozatot egy adott elemtől indulva? Ez itt a kvázi bonyolult, és nem az, hogy az honnan kezdődik
Ha ezt kifejted, Én elfogadom. -
Sihto_
tag
Szia
Tehat a peldadat nezve:
veszi az elso elemet 4
megjegyezzuk a 4 indexet az 1
majd megnezzuk, hogy negytol mekkora a leghosszabb novekvo sorozat : 2
azaz ha kisebb az elozonel akkor kiesik
tehat a 4 eseten a hossz 2 ezt letarolo, meg azt is, hogy ez az elso elemhez tartozik
veszem a kovetkezo elemet ez a 11
vegig megyek a sorozaton es kiesik az elem ha az elozonel kisebb azaz mind, igy itt a hossz 1, tehat a hossz marad a 2 es marad az elso elem
aztan veszem a kovetkezo elemet es igy tovabb majd eljutok a az 1 es elemhez
es akkor az lesz a leghosszab sorozat
remelem igy mar erthetobb -
Sihto_
tag
SZia, itt az en algoritmunsom, hatha egyszerubb:
tehat az elemek mar bent vannak egy tombben vagy esetleg menetkozben pakolodnak be, mindegy
van egy ciklusunk, ami vegig megy a tombelemeken egyesevel - ezek az elemek lesznek a kezdoertekek = a sorozatunk elso eleme
van egy valtozonk, amiben letaroljuk a sorozat hosszat, amit ugy szamitunk ki, hogy veszzuk az elso elemet, ami a ciklusvaltozoban van es megnezzuk, tolle hany nagyobb elem van, sorrendileg tehat ha kisebb, az elozonel, akkor az kiesik es igy vegigszaladunk a cikluson, ez ha nagyobb, mint a legutobbi sorozat hossza, akkor felulirjuk a sorozat hossza valtozot es egy masik valtozoba betesszuk(erdemenyvaltozo), hogy eppen melyik cikluselemnel tartunk, ha vegigment a ciklus, akkor kesz.
Persze meg lehetne bonyolitani, mert nem kell egy ido utan vegigszaguldani az osszes elemen, de ez igy eleg egyszeru, nem???
Remelem tudtam segiteni -
Empire
tag
Ismerős a feladat, majd megnézem hátha megvan valahol a megoldása.
-
heihachi
addikt
Hi!
Ha átalakítod ezt a rész, úgy, hogy kiveszed az egyenlőséget, akkor jó lesz!
for t := j+1 to n do begin
if (a[t] < a[j]) and (a[t] > k) then begin
bol := 1;
{writeln('a ',a[t],' elem jobb elem');}
end;
end;
A második sorban eredetileg volt egyenlőségjel.
Kipróbáltam a visszamenőleges példákra is, azokra is jó = jel nélkül.
[Szerkesztve] -
gabesz82
őstag
Hello Heihachi! Szóval át lett írva C-re a progi!
De van egy kis probléma vele:
Szóval:
feladat.be:
10
4 5 1 6 6 5 4 4 6 8
erre a te progid kimenetnek:
5
3 7 8 9 10
ami nem jó, mert van hosszabb:
6
1 2 4 5 9 10
Szóval tudnál még segíteni ebben??? -
gabesz82
őstag
Szia Szzsolt! Ha olvasod a fórumot, nézz már rá a mailedre... Ezer köszönet
-
Meg hát gráfos feladatokat máshogy nem is tudsz megoldani.
Pontosabban de, lehetséges, épp most csinálok ilyesmit, és mivel nekem új a fejlesztőkörnyezet, először nem rekurzívan kerestem legrövidebb utat egy gráfban.Hát el kellett felejteni.
A rekurzív algoritmus a pontok számával kvázi lineárisan lassult, a nem rekurzív meg kb. négyzetesen. Ami elég durva különbség. -
Szsolt
tag
válasz
Chaoti[X] #61 üzenetére
Hát ez akkora hülyeség, amekkora ez az ország....
Tudod van 1 olyan tantárgy, hogy mest.int, aminek a lényege a rekurzivitás, mert egyes feladatokat nem tudsz másképp megoldani.
Szvsz ezt minden tisztességes programozónak ismernie kell...
Az más dolog, hogy ide ehhez a feladathoz túl lassú... -
heihachi
addikt
-
-
heihachi
addikt
Valóban volt benne egy kis logikátlanság...
De javítottam
program Projectphc;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
n = 7;
var
a : array[1..n] of integer;
b : array[1..n] of integer;
k,j,t,s,max,bol : integer;
begin
a[1] := 3;
a[2] := 9;
a[3] := 11;
a[4] := 2;
a[5] := 6;
a[6] := 8;
a[7] := 10;
b[1] := 0;
b[2] := 0;
b[3] := 0;
b[4] := 0;
b[5] := 0;
b[6] := 0;
b[7] := 0;
for t:= 1 to n-1 do begin
k := a[t];
for j := t+1 to n do
if k <= a[j] then inc(b[t]);
{writeln('a[',t,':',b[t]);}
end;
b[n] := 0;
max := b[1];
s := 1;
for t := 2 to n do begin
if max <= b[t] then begin
max := b[t];
s := t;
{writeln('új max: ',max);}
end;
end;
k := a[s];
write(s, ' ');
if s <> n then begin
for j := s+1 to n do begin
if a[j] >= k then begin
{writeln('nagyobb elem: ',a[j]);}
bol := 0;
if j+1 > n then write(j, ' ')
else
begin
for t := j+1 to n do begin
if (a[t] < a[j]) and (a[t] >= k) then begin
bol := 1;
{writeln('a ',a[t],' elem jobb elem');}
end;
end;
if bol = 0 then begin
k := a[j];
write(j, ' ');
end;
end;
end;
end;
end;
readln;
end. -
Szsolt
tag
Próbáld meg ezt...
#include <stdio.h>
#include <stdlib.h>
int t[]={12,2,11,4,10,7};
int index[3];
int length=6, max=1;
void kiir() {
int i;
for (i=0; i<max; ++i)
printf(''%d '',index+1);
printf(''\n'');
}
void szamolmax(int n, int db) {
int i;
for (i=n+1; i<length; ++i)
if (t[n]<t) szamolmax(i,db+1);
else if (db>max) max=db;
if (db>max) max=db;
}
void mentes(int n, int db) {
int i;
index[db-1]=n;
if (max==db) kiir();
for (i=n+1; i<length; ++i)
if (t[n]<t) mentes(i,db+1);
}
int main() {
int i;
for (i=0; i<length; ++i)
szamolmax(i,1);
printf(''%d\n'',max);
for (i=0; i<length; ++i)
mentes(i,1);
return 0;
} -
heihachi
addikt
De jó!!! a lenne ilyen pascalban, akkor ott lenne egy pass de nincs (vagyis van elméletileg a magában álló ; de az meg nem állhat else előtt)
Vagy meg lehetne fordítani a feltételt is...
És műxik is.
Kipróbáltam pár esetre, és tutira hozza a várt eredményt.
De látom már megvan c-ben is
[Szerkesztve] -
Badb0y
addikt
Basszus de megy ez nektek
Hogy tanuljak meg én is b@33z@ meg -
Szsolt
tag
Hi Gabesz. Ahogy megígértem, itt a kód:
Annyit kell róla tudni,hogy a képernyőre írja a megoldásokat. Ha több van akkor mindet. Nálam működik, többre is kipróbáltam, de nem tudom garantálni, hogy szélsőséges esetekre is működik.
#include <stdio.h>
#include <stdlib.h>
int *t, *index, length, max=1;
int *lefoglal(int meret) {
int *tomb=(int*)calloc(meret,sizeof(int));
return tomb;
}
void beolvas() {
int i=0;
FILE *f=fopen(''feladat.be'',''r'');
fscanf(f,''%d'',&length);
t=lefoglal(length);
while (fscanf(f,''%d'',&t[i++])!=EOF);
}
void kiir() {
int i;
for (i=0; i<max; ++i)
printf(''%d '',index+1);
printf(''\n'');
}
void szamolmax(int n, int db) {
int i;
for (i=n+1; i<length; ++i)
if (t[n]<t) szamolmax(i,db+1);
else if (db>max) max=db;
if (db>max) max=db;
}
void mentes(int n, int db) {
int i;
index[db-1]=n;
if (max==db) kiir();
for (i=n+1; i<length; ++i)
if (t[n]<t) mentes(i,db+1);
}
void felszabadit() {
free(t);free(index);
}
int main() {
int i;
beolvas();
for (i=0; i<length; ++i)
szamolmax(i,1);
index=lefoglal(max);
printf(''%d\n'',length);
for (i=0; i<length; ++i)
mentes(i,1);
felszabadit();
return 0;
}
Üdv!
[Szerkesztve] -
heihachi
addikt
Íme:
program Projectphc;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
n = 6;
var
a : array[1..n] of integer;
b : array[1..n] of integer;
k,j,t,s,max,bol : integer;
begin
a[1] := 12;
a[2] := 2;
a[3] := 11;
a[4] := 4;
a[5] := 10;
a[6] := 7;
b[1] := 0;
b[2] := 0;
b[3] := 0;
b[4] := 0;
b[5] := 0;
b[6] := 0;
for t:= 1 to n-1 do begin
k := a[t];
for j := t+1 to n do begin
if k <= a[j] then begin
inc(b[t]);
end;
end;
end;
b[n] := 0;
max := b[1];
s := 1;
for t := 2 to n do begin
if max < b[t] then begin
max := b[t];
s := t;
end;
end;
k := a[s];
write(s, ' ');
if s <> n then begin
for j := s+1 to n do begin
if a[j] >= k then begin
bol := 0;
if j+1 > n then
write(j, ' ')
else
for t := j+1 to n do begin
if (a[t] < a[j]) and (a[t] >= k) then else bol := 1;
end;
if bol = 1 then begin
k := a[j];
write(j, ' ');
end;
end;
end;
end;
readln;
end. -
heihachi
addikt
EZ A KÓD NEM MŰKÖDŐ PASCAL KÓD!!!
De reméljük érthetőbb, mint az előző leírásom. Ha így sem megy, akkor megírom majd télleg pascalban, csak az holnap du előtt nincs meg...
#ennyi elem van a tömbben
n = 50;
#ebben a tömbben vannak a fájlból beolvasott adatok
a = array[1..n] of longint;
#ez nekünk egy segédtömb
#elegánsabb lenne, ha a[] tömbb többelemű lenne, de...
b = array[1..n] of longint;
#kigyűjtjük b[] tömbbe, hogy a[] tömb egyes elemeire nézve a tömbben 'mögötte' #hány nála nagyobb-egyenlő elem van
for t:= 1 to n-1 do begin
k := a[t];
for j := t+1 to n do begin
if k <= a[j] then begin
k := a[j];
b[t] := b[t]+1;
end;
end;
end;
b[n] := 0;
#ezek után a b[] tömbb legnagyobb eleme meg is felel nekünk
#ha több maximum van, akkor több megoldás van
#azért visszafele nézem, mert így s sorszám után a lehető legkevesebb elem lesz #a[] tömbben, de még a feltételnek így is megfelel
max := b[n];
for t := n-1 downto 1 do begin
if max<b[t] then max := b[t];
s := t;
end;
#max változó mehet ki a kimeneti fájl első sorába
writeln(max);
#most pedig kiválogatjuk a[] tömbből a kérdéses elemeket
#nem kell végignézni az egész tönböt, csak onnan kell indulni, ahol a maximumot #megállapítottuk
#itt jön jól, hogy az előbb visszafele néztünk a tömb maximumához tartozó #sorszámot, így most a lehető legkevesebb elemet kell átvizsgálni
k := a[s];
write(s, ' ');
for j := s+1 to n do begin
if a[j] >= k then begin
k := a[j];
write(j, ' ');
end;
end;
Hogy belefér-e 16 megába, meg nemtom milyen megkötésekbe, azt nem tom...
[Szerkesztve] -
Szsolt
tag
Jah igazad van: 2 4 5-öt akartam írni...
Na és így?
Elvileg így is monoton...
[Szerkesztve] -
gabesz82
őstag
gLes és segíteni nem tudsz??
-
gLes
őstag
Blááá hogy útáltam ezeket az algoritmusokat
-
-
Badb0y
addikt
2szer vágtak már meg c programozásból következőre kivágnak
, de hozzá kell tenni semmit nem gyakoroltam, ugyhogy kérhetnék vmi tanácsot hogy kezdjek neki? Milyen könyv? Megvettem a Computerbooksos programozzunk c nyelvent ezt ajánlották nagyon.
-
gabesz82
őstag
Azért ha tudtok segítsetek ám, mert én inkább a hardverhez értek valamicskét, a programírás nem a legnagyobb erősségem... Szóval csak hajrá az ötletekkel
-
gabesz82
őstag
Sziasztok!
Szóval köszönöm az eddigi segítségeket! Innentől már megpróbálkozunk, de azért ha valamit még hozzá tudtok tenni akkor szívesen várom a segítségeket... Köszi mindenkinek... -
heihachi
addikt
Na jó, kezdem Én, aztán majd javítgatjuk közösen... Tehát:
Adott a[] tömb, amelynek van n eleme. Ez tárolja a beolvasott számokat.
Adott b[] tömb, szintén n eleme van, és b[j]-ben tárolódik az, hogy a[j] elemre tekintve hány releváns elem van a tömbben. (Ez így bonyolultan hangzik, de mindjárt írom rendesebben...)
Tehát elindulsz a[] tömb első elemétől. Kinevezel egy k változót keresési értéknek, k=a[j] azaz kezdetben a[1]. Megvizsgálod, hogy a[j+1] nagyobbegyenlő-e, mint k.
- Ha nem, akkor léphetsz is tovább, és megvizsgálod, hogy a[j+2] nagyobbegyenlő-e, mint k.
- Ha igen, akkor k=a[j+1] és b[j]++, és nézed tovább (azaz a[j+2]>=k).
Tehát ez két egymásba ágyazott ciklus.
Így végigjárva a teljes a[] tömböt a b[] tömbben a legnagyobb érték a kérdéses kimeneti fájl első sora lesz.
Ezek után meg kell nézni, hogy melyik ez a legnagyobb érték, és az előbb leírt elvhez hasonlóan meghatározni a megfelelő indexeket. Itt már nem kell bejárni a teljes tömböt, csak a kérdéses elemre, kell a fentieket megycsinálni, és kiírni az indexet.
Na egyenlőre ennyi. Sztem műxik, de nem biztos, hogy jó, pláne meg nem biztos, hogy értelmesen írtam le
[Szerkesztve] -
corm
senior tag
azert a sok ''huje'' progmatos hogy rakattant egybol a topcira
-
corm
senior tag
a 2,4,6 jo mert ugye ezek indexek a 2. indexu elem a 2 a 4. indexu a 4 a 6. indexu a 7.
es ugye van aza kikotes h az indexeknek is noveknoknek kell lenniuk, ezert nemlehet ezt folytatni, mert a 6. az utolso(legnagyobb) index -
Chaoti[X]
csendes tag
Ha jól sejtem ez egy Algoritmusok kötelező progi szóval tuti hogy számít az idő és memóriahasználat.
Talán 1mp és 16 Mb? -
Gyula_
tag
Ha az idő-és tárigényre semmilyen megkötés sincs, akkor nem mindegy, hogy milyen algoritmust ír?
Most nem gondoltam bele, de biztos könnyen kitalálható valamilyen egyszerű, ami véges idő- és tárigénnyel megoldja.
Hm?
Ha tévedek, szóljatok... -
gabesz82
őstag
a
feladat.ki módosul:
3
2 4 7 -
gabesz82
őstag
Valaki??? Senki?
-
heihachi
addikt
Nem értem, hogy hogy jött ki 2 4 6 ...
-
Miracle
senior tag
kijött az ADA beadandóm, nem lesz időm, sorry. azért sok sikert!
-
Miracle
senior tag
-
gabesz82
őstag
Adott egy egész számokból álló A = (a_1, . . . , a_n) sorozat. Számítsuk az A sorozat leghosszabb monoton nem-csökkenő részsorozatának hosszát, és adjunk is meg egy ilyen részsorozatot. Egy A sorozat részsorozata minden
olyan sorozat, amely A-ból annak bizonyos elemeinek elhagyásával kapható.
Bemenet:
A feladat.be szöveges állomány első sora a sorozat n (1 <= n <= 10000) hosszát tartalmazza. A második sor pontosan n egész számot tartalmaz egy-egy szóközzel elválasztva. A második sorban minden x számra teljesül,
hogy 1 <= x <= 1000000.
Kimenet:
A feladat.ki szöveges állomány első sora a leghosszabb monoton nemcsökkenő részsorozat m hosszát tartalmazza. A második sor pontosan m különböző számot tartalmazzon egy-egy szóközzel elválasztva, a bemeneti (a_1, . . . , a_n) számsorozat azon 1 <= i_1 < i_2 < . . . < i_m <= n indexeit, amelyek ebben a sorrendben egy leghosszabb monoton nemcsökkenő részsorozatát alkotják a bemeneti sorozatnak, tehát a_i_1 <= a_i_2 <= . . . <= a_i_m.
Példa bemenet és kimenet
feladat.be
6
12 2 11 4 10 7
feladat.ki
3
2 4 6
Ez lenne a feladat:
Maga a beolvasás kiíratás megy csak a program lényege, az algoritmus hiányzik még hozzá... Nagyon megköszöném a segítséget, köszi előre is mindenkinek...
Aktív témák
- HiFi műszaki szemmel - sztereó hangrendszerek
- Kormányok / autós szimulátorok topikja
- Milyen légkondit a lakásba?
- Borotva, szakállnyíró, szakállvágó topic
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Milyen okostelefont vegyek?
- Androidos tablet topic
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- EA Sports WRC '23
- További aktív témák...
- Samsung Galaxy A50 128GB, Kártyafüggetlen, 1 Év Garanciával
- GYÖNYÖRŰ iPhone 13 Pro Max 1TB Gold -1 ÉV GARANCIA - Kártyafüggetlen, MS3051
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 16/32/64GB RAM RX 9060XT 16GB GAMER PC termékbeszámítással
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! HP EliteDesk 800 G1 TWR brand számítógép garanciával hibátlan működéssel
Állásajánlatok
Cég: FOTC
Város: Budapest