Para un ejercicio de programación competitiva debo ordenar ciertos datos, y cuando estos son iguales debo ordenarlos alfabéticamente. El problema es que si los nombres son "iguales" deberían imprimirse de la misma forma en la que fueron impresos. Este es mi código:
#include <bits/stdc++.h>
using namespace std;
bool condicion(pair<string,vector<int>> &x, pair<string,vector<int>> &y ){
x.second[4]=x.second[0]+x.second[1];
y.second[4]=y.second[0]+y.second[1];
if(x.second[0]>y.second[0])return true;
if(x.second[0]==y.second[0] and x.second[1]>y.second[1])return true;
string a= x.first, b = y.first;
for (int j = 0; j <a.size(); j++) a[j]=tolower(a[j]);
for (int j = 0; j < b.size(); j++)b[j]=tolower(b[j]);
if(a<b)return true;
return false;
}
int main(){
int neq, npar; //numero de equipos y partidas
while(cin>>neq and neq!=0){
cin>>npar;
map<string,vector<int>>mapa;
for (int i = 0; i < neq; ++i){ //crea equipos
string equipos;
vector<int>puntos;
for (int j = 0; j < 5; ++j)puntos.push_back(0);
cin>>equipos;
mapa[equipos]=puntos;
}
for (int i = 0; i < npar; ++i){ //analiza las partidas formato equipo1 0 - 0 equipo2
int puntos1[10]={0},puntos2[10];
int gol1,gol2;
string equipo1,equipo2;
cin>>equipo1>>gol1;
getchar();
getchar();
getchar();
cin>>gol2>>equipo2;
if(gol1>gol2)mapa[equipo1][0]+=3;
else if(gol2>gol1)mapa[equipo2][0]+=3;
else{mapa[equipo2][0]+=1; mapa[equipo2][0]+=1;}
//goles dados
mapa[equipo1][1]+=gol1;
mapa[equipo2][1]+=gol2;
//goles recibidos
mapa[equipo1][2]+=gol2;
mapa[equipo2][2]+=gol1;
//partidas
mapa[equipo1][3]++;
mapa[equipo2][3]++;
}
vector<pair<string,vector<int>>> orden;
map<string,vector<int>>::iterator it;
for (it=mapa.begin(); it!=mapa.end(); ++it)orden.push_back(make_pair(it->first,it->second));
sort(orden.begin(),orden.end(),condicion);
int pos =1;
for (int i=0; i<orden.size(); ++i){
if(i==0)cout<<pos<<".";
else if(orden[i].second[4]==orden[i-1].second[4])cout<<" ";
else cout<<pos<<".";
pos++;
int aux = 15 - orden[i].first.size();
for(int j = 0; j<aux;j++)cout<<" ";
cout<<orden[i].first<<" "<<orden[i].second[0]<<" "<<orden[i].second[3]
<<" "<<orden[i].second[1]<<" "<<orden[i].second[2]<<" "<<orden[i].second[1]-orden[i].second[2];
if(orden[i].second[3]==0)cout<<" N/A"<<endl;
else printf("%6.2f\n", orden[i].second[0] * 100.0 / (3.0 * orden[i].second[3]));
}
}
return 0;
}
El problema es que cuando hay una entrada del tipo
4 0
B
b
a
A
me imprime los datos tal que
1. A 0 0 0 0 0 N/A
a 0 0 0 0 0 N/A
B 0 0 0 0 0 N/A
b 0 0 0 0 0 N/A
En vez de
1. a 0 0 0 0 0 N/A
A 0 0 0 0 0 N/A
b 0 0 0 0 0 N/A
B 0 0 0 0 0 N/A
Que seria el orden correcto de la entrada.
Imagino que el problema recae en mi condición del sort:
bool condicion(pair<string,vector<int>> &x, pair<string,vector<int>> &y ){
x.second[4]=x.second[0]+x.second[1];
y.second[4]=y.second[0]+y.second[1];
if(x.second[0]>y.second[0])return true;
if(x.second[0]==y.second[0] and x.second[1]>y.second[1])return true;
string a= x.first, b = y.first;
for (int j = 0; j <a.size(); j++) a[j]=tolower(a[j]);
for (int j = 0; j < b.size(); j++)b[j]=tolower(b[j]);
if(a<b)return true;
return false;
}
Pero genuinamente no logro hacer que funcione, es lo ultimo que me falta para resolver este problema(Y si, me di cuenta muy tarde que era mejor hacer una estructura en vez de usar vectores).