•ucc_5
Client obisnuit

Karma: -11
Deconectat
Mesaje: 82
|
 |
« : Aprilie 23, 2009, 13:24:59 » |
|
Deci am gasit o problema pe care pur si simplu nu o pot rezolva , desi la inceput pare usoara. Fie un sir de litere mici ale alfabetului englez. Oricare 2 (sau mai multe) caractere alaturate, de acelasi fel, pot fi eliminate din sir. Se cere eliminarea cat mai multor caractere astfel incat sirul obtinut sa fie cat mai mic si sa se afiseze sirul. Daca exista mai multe siruri se vor afisa toate. Ex1: abbfggh => afh Ex2: abbaab => b sau a
|
|
|
|
|
Memorat
|
|
|
|
|
•alexandru92
|
 |
« Răspunde #1 : Aprilie 23, 2009, 15:15:28 » |
|
Mie problema mi se pare extrem de simpla. #include<stdio.h> #include<string.h> char s[100],c; int i,n; int main() { gets(s); //citesc sirul n=strlen(s)-1; //lungimea sirului for(i=0;i<n;++i) if(s[i]==s[i+1]) //daca am dat peste 2 litere asemanatoare {c=s[i]; while(c==s[i]) strcpy(s+i,s+i+1); //sterg elementul din sir i=-1; n=strlen(s)-1; //incep de la inceput } puts(s); //afisez sirul :D return 0; }
|
|
|
|
« Ultima modificare: Aprilie 23, 2009, 15:20:57 de către alexandru »
|
Memorat
|
|
|
|
|
•sima_cotizo
|
 |
« Răspunde #2 : Aprilie 23, 2009, 16:03:12 » |
|
Ce te faci daca ai ceva gen "aaabbbacaa" ? Cred ca algoritmul tau iti zice ca ramane "ac", dar de fapt raspunsul este "c".
|
|
|
|
|
Memorat
|
|
|
|
|
•alexandru92
|
 |
« Răspunde #3 : Aprilie 23, 2009, 17:57:59 » |
|
Oricare 2 (sau mai multe) caractere alaturate, de acelasi fel, pot fi eliminate din sir.
|
|
|
|
|
Memorat
|
|
|
|
|
•sima_cotizo
|
 |
« Răspunde #4 : Aprilie 23, 2009, 18:05:39 » |
|
Oricare 2 (sau mai multe) caractere alaturate, de acelasi fel, pot fi eliminate din sir. Hint: elimini intai "b"-urile 
|
|
|
|
|
Memorat
|
|
|
|
•ucc_5
Client obisnuit

Karma: -11
Deconectat
Mesaje: 82
|
 |
« Răspunde #5 : Aprilie 23, 2009, 18:39:56 » |
|
Pai pot fi eliminate oricare 2 , dar trebuie eliminate astfel incat sa se obtin un sir cat mai mic. Programul tau pentru aabbacaa afisaza ac, cand ar trebui sa afiseze c. Si pentru siruri mai mari se impute treaba 
|
|
|
|
|
Memorat
|
|
|
|
|
•wefgef
|
 |
« Răspunde #6 : Aprilie 23, 2009, 18:51:12 » |
|
Hint: Problema se rezolva cu programare dinamica  .
|
|
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
•ucc_5
Client obisnuit

Karma: -11
Deconectat
Mesaje: 82
|
 |
« Răspunde #7 : Aprilie 23, 2009, 20:04:10 » |
|
Hint: Problema se rezolva cu programare dinamica  . M-am gandit si la asta, dar n-am gasit recurenta.
|
|
|
|
|
Memorat
|
|
|
|
|
•alexandru92
|
 |
« Răspunde #8 : Aprilie 23, 2009, 20:46:08 » |
|
Dar daca am retine intr-o stiva sirurile pe care le stergem consecutiv.Adica daca avem aaabbb, in stiva sa retinem doar a si b. Apoi cand dam de un caracter care nu este egal cu urmatorul sa vad daca in spatele lui ar fi fost un sir care l-ar fi incadrat. Adica daca luam sirul dat de Simo Cotizo: "aaabbbacaa". In stiva punem : 'a'. Si inlocuim in sir 'a' cu . si vom aveam "...bbbacaa" Urmeaza :'b'. Punem si pe b in stiva si modificam sirul "......acaa" Pai acum 'a'!='c'. Dar in spatele lui a este un '.' deci vedem daca in stiva avem un sir a. Si avem, il inlocuim pe a cu '.' Si continuam. Vine 'c'!='a' si cum nici in stiva nu se afla un sir care sa inceapa cu 'c', golim stiva si nu inlocuim 'c' cu '.' .Continuam cu parcursul vectorului. Dam de 'a' si punem 'a' in stiva si il inlocuim peste tot cu '.' si obtinem sirul '......c..' N-am testat ideea decat pe sirurile mentionate mai sus #include<stdio.h> #include<string.h> #include<stdlib.h> char s[100],v[100],c; int n,i=1,vf=-1; int main() { gets(s); n=strlen(s)-1; for(i=0;i<n;++i) if(s[i]!='.'&&s[i+1]!='.') {if(s[i]==s[i+1]) { c=s[i]; while(c==s[i]&&i<=n) s[i++]='.'; v[++vf]=c; i=0; }else if(vf) {vf=-1; memset(v,0,sizeof(v));} }else if(s[i]=='.'&&s[i+1]!='.') {if(strchr(v,s[i+1])) s[i+1]='.',i=0; else if(vf) vf=-1,memset(v,0,sizeof(v)); }else if(s[i]!='.'&&s[i+1]=='.') {if(strchr(v,s[i])) s[i]='.',i=0; else if(vf)vf=-1,memset(v,0,sizeof(v)); } for(i=0;i<=n;++i) if(s[i]!='.') printf("%c",s[i]); system("PAUSE>NULL"); return 0; }
|
|
|
|
|
Memorat
|
|
|
|
|
•wefgef
|
 |
« Răspunde #9 : Aprilie 23, 2009, 21:00:46 » |
|
Ideea e proasta. Asa cum am mentionat mai sus, e nevoie de programare dinamica.
|
|
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
|
•Mishu91
|
 |
« Răspunde #10 : Aprilie 23, 2009, 21:33:10 » |
|
Hint: Problema se rezolva cu programare dinamica  . M-am gandit si la asta, dar n-am gasit recurenta. Pai iti tii un sir in care tii minte ultima aparitie a fiecarui caracter, si acel caracter il poti elimina doar daca intre pozitia lui si pozitia ultimei aparitii poti elimina toate caracterele Cam ceva de genu asta ar fi.
|
|
|
|
|
Memorat
|
|
|
|
•ucc_5
Client obisnuit

Karma: -11
Deconectat
Mesaje: 82
|
 |
« Răspunde #11 : Aprilie 24, 2009, 20:55:44 » |
|
Cred ca ai dreptate mishu, am incercat si se pare ca merge. Totusi, nu stiu daca solutia asta trateaza toate cazurile. Intre timp mai am o rugaminte. Poate sa-mi demonstreze cineva "Problema specatacolelor". Am stat mult sa ma gandesc de ce e asa si pur si simplu nu inteleg logica solutiei. Ma poate ajuta cineva?
|
|
|
|
|
Memorat
|
|
|
|
|
•toni2007
|
 |
« Răspunde #12 : Aprilie 24, 2009, 21:23:05 » |
|
Problema se rezolva sortand intervalele dupa capatul din dreapta, apoi luand pe rand intervalele care au capatul din stanga mai mare decat ultimul capat din dreapta. Demonstrez intai de ce voi lua primul interval.
Demonstratia se face prin metoda reducerii la absurd:
Presupunem prin reducere la absurd ca nu vom lua primul interval, si vom lua un interval cu capatul din dreapta Dr. Atunci Dr va fi mai mare decat capatDr[1], caz in care vom avea mai putine sanse de a obtine maximul, sau Dr va fi egal cu capatDr[1], caz in care nu se influenteaza cu nimic (sunt sortate). (Contradictie).
Demonstratia ca la fiecare pas, avand fixat capatDreaptaUltim, vom alege elementul j minim astfel incat capatSt[j] > capatDreaptaUltim, se face analog. (Daca nu intelegi detaliez).
|
|
|
|
|
Memorat
|
|
|
|
•ucc_5
Client obisnuit

Karma: -11
Deconectat
Mesaje: 82
|
 |
« Răspunde #13 : Aprilie 26, 2009, 22:29:11 » |
|
Am inteles putin, dar daca poti sa detaliezi mai mult as fi recunoscator  Gata, am inteles treaba cu problema spectacolelor Mai am o intrebare. Daca avem doua siruri x,y formate din litere mari si mici ale alfabetului englez , cum le sortam lexicografic ? "a" e mai mic ca "A" , nu ? daca da atunci nu mere sa compar codul fiecarei litere (cu strcmp) . Cum se aranjeaza lexicografic in cazul asta ? cu strcmp sau fac functie separata ca sa considere "a" < "A" (analog pt toate literele) ? [editat] Foloseste butonul "Modifica"
|
|
|
|
« Ultima modificare: Aprilie 26, 2009, 22:33:20 de către Sima Cotizo »
|
Memorat
|
|
|
|
|
•sima_cotizo
|
 |
« Răspunde #14 : Aprilie 26, 2009, 22:36:46 » |
|
Ti-am mai spus o data sa-ti editezi mesajele. Chiar nu ai citit ce era cu rosu?  Ca sa iti raspund la intrebare: in mod normal 'A'<'a' (ceea ce e indicat si de codurile ASCII), deci 'Abc'<'abc'. Daca tu vrei ca 'a'<'A' atunci faci o functie de comparare de mana. Daca 'a'=='A' atunci poti sa compari cuvintele dupa ce le-ai trecut la uppercase (dar poate fi mai complicat decat sa faci compararea de mana daca, de exemplu, trebuie sa le afisezi la sfarsit in forma in care le-ai citit).
|
|
|
|
|
Memorat
|
|
|
|
•ucc_5
Client obisnuit

Karma: -11
Deconectat
Mesaje: 82
|
 |
« Răspunde #15 : Aprilie 27, 2009, 13:38:56 » |
|
Am inteles, si scuze pentru treaba cu editatul, sunt obijunuit prost de pe alte forumuri unde nu zice nimeni nimic pentru ca ai voie sa-l editezi in maxim 5 minute.
|
|
|
|
|
Memorat
|
|
|
|
|