poate cineva să scrie un program c ++ pentru această problemă



Sunteți angajat de ONU să optimizați software-ul care se ocupă de programarea vorbitorilor în plen. Pentru următoarea sesiune, se înscriu o serie de vorbitori, identificați prin țara de unde provin și numărul de minute pe care estimează că îl vor vorbi.


Date de intrare

Pe fiecare linie se va afla un nume de țară a vorbitorului și o durată în minute, număr întreg, separate prin spațiu. Numărul de vorbitori înscriși este necunoscut.


Date de ieșire

Programați vorbitorii, afișând pe fiecare linie țara din care fac parte și durata discursului, separate prin virgulă, astfel încât discursurile cele mai lungi să fie programate înaintea celor mai scurte. Dacă două discursuri au aceeași durată, se vor programa în ordinea alfabetică a țării de unde provin vorbitorii. Pe ultima linie de la ieșire se vor afișa durata totală a conferinței și durata medie a unui discurs, număr fracționar cu două zecimale, separate prin spațiu.



(13p) Datele de intrare specificate mai sus vor conține garantat nume de țări unice formate dintr-un singur cuvânt, și durate de timp întregi în intervalul [10; 60] de minute.


Exemplu intrare

Franta 30

Olanda 15

Belgia 20

Romania 45

Ungaria 15

Germania 10

Suedia 15


Exemplu ieșire

Romania,45

Franta,30

Belgia,20

Olanda,15

Suedia,15

Ungaria,15

Germania,10

150 21.43



(3p) Delegațiile din anumite țări sunt extrem de prost organizate, astfel încât se înscriu mai mulți vorbitori din aceeași țară, cu propriile discursuri. Acest lucru nu este posibil și deci trebuie selectat un singur vorbitor din fiecare țară, și, pentru a nu decala programările ulterioare, se va alege discursul de durată maximă din fiecare țară prezentă. Datele de intrare specificate mai sus pot conține acum aceeași țară de mai multe ori.


Exemplu intrare:

Franta 30

Ungaria 15

Olanda 15

Romania 30

Belgia 20

Romania 45

Ungaria 15

Germania 10

Ungaria 10

Suedia 15


Exemplu ieșire

Romania,45

Franta,30

Belgia,20

Olanda,15

Suedia,15

Ungaria,15

Germania,10

150 21.43


(3p) Anumiți demnitari au completat greșit datele de înscriere, astfel încât durata discursului lor este ori mai mică decât 10 sau mai mare decât 60 (de minute), caz în care aceștia vor fi eliminați din conferință.


Exemplu intrare

Franta 30

Croatia -5

Olanda 15

Lituania 3

Belgia 20

Romania 45

Ungaria 15

Germania 10

Bulgaria 76

Suedia 15


Exemplu ieșire

Romania,45

Franta,30

Belgia,20

Olanda,15

Suedia,15

Ungaria,15

Germania,10

150 21.43


(3p) La conferință s-au anunțat în ultimul moment și participanți din Marea Britanie și invitați din Arabia Saudită, caz în care acum la intrare pot exista țări cu nume formate din mai multe cuvinte.


Exemplu intrare

Franta 30

Olanda 15

Regatul Unit al Marii Britanii si al Irlandei de Nord 20

Romania 45

Ungaria 15

Germania 10

Republica Moldova 15


Exemplu ieșire

Romania,45

Franta,30

Regatul Unit al Marii Britanii si al Irlandei de Nord,20

Olanda,15

Republica Moldova,15

Ungaria,15

Germania,10

150 21.43


(3p) Dacă durata totală a conferinței este mai mare de 8h, se vor elimina în ordine din vorbitorii cu durata cea mai mare de discurs, în ordinea programării de la primul subpunct, până când durata conferinței scade sub 8h inclusiv (adică se acceptă și o conferința de fix 8 ore).


Exemplu intrare

Brazil 45

Colombia 29

Netherlands 44

Indonesia 60

Mexico 20

Japan 56

France 54

Bahrain 47

Tanzania 60

Vietnam 55

China 55

Italy 25

Madagascar 58

Honduras 43

Poland 52

Gambia 41

Mongolia 60

Philippines 55

Lithuania 29

Uzbekistan 21

Paraguay 44

Thailand 40

Botswana 15

Kyrgyzstan 23

Ukraine 59

Ethiopia 39

Lebanon 46

Kenya 18

Sweden 49

Panama 15

Portugal 50

Russia 57

Ecuador 26

Afghanistan 53


Exemplu ieșire

Netherlands,44

Paraguay,44

Honduras,43

Gambia,41

Thailand,40

Ethiopia,39

Colombia,29

Lithuania,29

Ecuador,26

Italy,25

Kyrgyzstan,23

Uzbekistan,21

Mexico,20

Kenya,18

Botswana,15

Panama,15

472 29.50

Răspuns :

#include <iostream>

#include <cstring>

#include <fstream>

#include <cstdlib>

#include <iomanip>

using namespace std;

ifstream f("intrare.txt");

//Declara vectorul de tari

struct tara{

char nume[100]="";

int minute;

} v[100];

int n;

//FUNCTII

void sorteaza(){

   //Sorteaza descrescator dupa durata (Bubble Sort). Daca durata e egala, sorteaza dupa nume

bool ok=1;

while(ok){

 ok=0;

 for(int i=0;i<n-1;i++){

  if(v[i].minute < v[i+1].minute || ((v[i].minute == v[i+1].minute) & (strcmp(v[i].nume, v[i+1].nume)>0))){

   swap(v[i], v[i+1]);

   ok=1;

  }

 }

}

}

void sterge_inregrisrare(int x){

   //Functie care sterge inregistrarea cu ordin x

   //Sterge inregistrare cu numar n

   int k;

   //Muta elementele mai la stanga

   for(k=x;k<n-1;k++) v[k] = v[k+1];

   //Micsoreaza contorul

   n--;

}

void verifica_timp_valid(){

   //Sterge inregistrarile care au sub 10 minute sau peste 60

   for(int i=0;i<n;i++){

       if(v[i].minute<10 || v[i].minute > 60) sterge_inregrisrare(i);

   }

}

void verifica_inregistrari_duble(){

   //Verifica si sterge inregistrarile daca apare acelasi nume

   int i,j,k;

   //Pentru fiecare inregistrare

   for(i=0;i<n;i++){

       //Verifica daca exista alta inregistreare cu acelasi nume

       for(j=i+1;j<n;j++){

           if(strcmp(v[i].nume, v[j].nume)==0){

               //Sterge inregistarea j

               sterge_inregrisrare(j);

           }

       }

   }

}

int calculeaza_durata(){

  //Returneaza durata totala a intalnirii

  int s=0;

  for(int i=0;i<n;i++) s+=v[i].minute;

  return s;

}

void verificare_8ore(){

   //Functie care verifica si se asigura ca intalnirea dureaza 8 ore

   while (calculeaza_durata()>8*60){

       sterge_inregrisrare(0);

   }

}

int main(){

//Citeste date intrare, acceptand tari cu nume compuse

int i=0;

char x[100];

while(f){

 //Citeste grupul de caractere

 f >> x;

 //Daca nu sunt cifre, adauga grupul de caractere in nume

 while(!isdigit(x[0])){

           //Copiaza

  strcat(v[i].nume, x);

           //Adauga spatiu

  strcat(v[i].nume, " ");

  //Citeste numar urmator

  f >> x;

 }

 //Sterge ultimul spatiu din nume

 strcpy(v[i].nume+strlen(v[i].nume)-1,v[i].nume+strlen(v[i].nume));

 //Transforma grupul de caractere in numar, adauga la minute;

 v[i].minute = atoi(x);

 //Treci la inregistarea urmatoare

 i++;

}

n=i-1;

   sorteaza();

verifica_inregistrari_duble();

verifica_timp_valid();

   verificare_8ore();

//Afiseaza rezultat

for(i=0;i<n;i++) cout << v[i].nume << "," << v[i].minute << endl;

   //Afiseaza timp discurs

   cout << calculeaza_durata() << " " << fixed << setprecision(2) << float(calculeaza_durata())/n;

}

Vezi imaginea Andrei750238