Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
PC game stream catre Nvidia Shiel...

Pompa de apa HEPU ?!

Vreau o masina electrica de tocat...

Cum ajunge remorca de tir inapoi ...
 Alt "Utilizator nou" pe T...

ULBS INFORMATICA

Index preturi

Boxa membrana tweeter infundata
 Am nevoie de poze cu un curcubeu

Whisky for Mac

Xiaomi 14 Gpay

Izolare zid exterior de scandura
 Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...

De ce sunt oamenii nostalgici
 

Problema cu lingouri de aur

* * * * - 1 votes
  • Please log in to reply
23 replies to this topic

#19
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Alocare dinamica (de mana sau cu std::vector) si iti incap elemente cat tine memoria. Dar nici nu trebuie sa le tii pe toate in array, algoritmul gasit le proceseaza pe rand.

#20
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,025
  • Înscris: 24.02.2006
ce algoritmi ati folosit?
nu sunt convins ca un algoritm liniar (gen greedy) gaseste intotdeauna solutia optima.

#21
AlexMatei2000

AlexMatei2000

    New Member

  • Grup: Junior Members
  • Posts: 12
  • Înscris: 25.01.2018

View Post_Smiley_, on 08 iunie 2018 - 17:52, said:

ce algoritmi ati folosit?
nu sunt convins ca un algoritm liniar (gen greedy) gaseste intotdeauna solutia optima.

#include <iostream>
#include <fstream>
using namespace std;
main()
{
ifstream lin("input-10.txt");
char s1[5],s2[5],s3[5];
int n;
struct{
	 int x,y,z;
} lingou[100];
lin>>n;
for (int i=0;i<n;i++)
{
	 lin>>s1>>lingou[i].x>>lingou[i].y>>lingou[i].z>>s2>>s3;
}
int aux;
for (int j=0;j<n;j++)
		 if (lingou[j].x>lingou[j].y){
			 aux=lingou[j].x;
			 lingou[j].x=lingou[j].y;
			 lingou[j].y=aux;
		 }
for (int j=0;j<n;j++)
		 if (lingou[j].y>lingou[j].z){
			 aux=lingou[j].y;
			 lingou[j].y=lingou[j].z;
			 lingou[j].z=aux;
		 }
for (int j=0;j<n;j++)
		 if (lingou[j].x>lingou[j].y){
			 aux=lingou[j].x;
			 lingou[j].x=lingou[j].y;
			 lingou[j].y=aux;
		 } /// le aranjez crescator, ca sa scap dea cea mai mare din ele.
int max1=0,max2=0;
for (int i=0;i<n;i++)
	 if (lingou[i].x>max1) max1=lingou[i].x;
for (int i=0;i<n;i++)
	 if (lingou[i].y>max2) max2=lingou[i].y;
cout<<max1*max2<<endl;
return 0;
}

E in c++. L-am explicat in pagina anterioara. Nu functioneaza pentru 100% din cazuri, dar majoritatea sunt corecte. Nu cred ca metoda greedy sa functioneze in acest caz. Oricum metodele alea sunt antice si necesita o gramada de linii de cod. Acum se poate de realizat acelasi lucru in mult mai putine linii, si cu o complexitate mai mica de asemena.

Edited by AlexMatei2000, 08 June 2018 - 18:05.


#22
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Algoritmul meu arata cam asa. Nu garantez ca e corect in toate cazurile (daca cineva are cazuri aparte, ar prinde bine niste intrari de test).

Plecand de la eliminarea laturii celei mai mari a fiecarui lingou:

Attached File  algoritm.png   177K   13 downloads

Edited by dani.user, 08 June 2018 - 18:12.


#23
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,025
  • Înscris: 24.02.2006

View PostAlexMatei2000, on 08 iunie 2018 - 17:59, said:

...Nu cred ca metoda greedy sa functioneze in acest caz. Oricum metodele alea sunt antice si necesita o gramada de linii de cod. Acum se poate de realizat acelasi lucru in mult mai putine linii, si cu o complexitate mai mica de asemena.
probabil ca nu-ti dai seama, dar ai folosit fix metoda greedy :)
si asa cum ti-ai dat singur seama, nu e o solutie corecta. pornesti de la presupunerea ca rezultatul va fi un singur orificiu, si evident ca nu e cazul.


View Postdani.user, on 08 iunie 2018 - 18:03, said:

Algoritmul meu arata cam asa. Nu garantez ca e corect in toate cazurile (daca cineva are cazuri aparte, ar prinde bine niste intrari de test).
nu cred ca e corect. la modul minimal, procesarea aleatorie e a lingourilor nu garanteaza un rezultat bun. uite un contraexemplu: 3 lingouri , unul de 3x4, unul de 1x7 si altul de 100x100. algoritmul tau va procesa intai primele 2 lingouri si va decide ca e nevoie de 2 orificii, apoi va procesa ultimul lingou si in cel mai bun caz va decide sa mareasca unul dintre orificii, rezultand in final doua orificii. rezultatul corect este, evident, un singur orificiu (de 100x100) prin care pot fi scoase toate lingourile.

ma intreb daca se poate demonstra matematic ca renuntarea la latura cea mai mare nu afecteaza obtinerea unui optim...

#24
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Bun exemplu. Cred ca l-ar rezolva algoritmul meu daca sortez initial lingourile in ordine descrescatoare (a ariei probabil).

Renuntarea la latura cea mai mare nu o vad ca o dificultate matematica. Practic cautam cea mai mica proiectie in plan a lingoului, latura cea mai mare fiind perpendiculara pe acea proiectie, deci irelevanta.

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate