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ăspunsuri la întrebare
#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;
}