# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
350018 | Kirishina | Poi (IOI09_poi) | C++14 | 691 ms | 16108 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct datosConcursante {
int id;
int puntos;
int problemasResueltos;
};
enum TipoCampo {id, puntos, problemasResueltos};
TipoCampo campoAOrdenar;
bool comparacion(const datosConcursante& a, const datosConcursante& b)
{
bool bReturn;
switch (campoAOrdenar) {
case id : bReturn = a.id < b.id; break;
case puntos: bReturn = a.puntos > b.puntos; break;
case problemasResueltos: bReturn = a.problemasResueltos > b.problemasResueltos; break;
}
return bReturn;
}
int buscarPorID(int p, vector<datosConcursante>& V) {
int i=0;
bool encontrado=false;
while(!encontrado && (i<V.size())){
if (V[i].id==p) encontrado=true;
else i++;
}
return i;
}
bool igual(datosConcursante a, datosConcursante b,TipoCampo campo){
bool bIgual=false;
switch (campo) {
case id : bIgual = (a.id == b.id); break;
case puntos: bIgual = (a.puntos == b.puntos); break;
case problemasResueltos: bIgual = (a.problemasResueltos == b.problemasResueltos); break;
}
return bIgual;
}
/*
* Devuelve un vector de datosConcursante por los que estan empatados por el valor pasado en el 3 parámetro
*/
vector <datosConcursante> buscarEmpatados(int pos, vector<datosConcursante>& V, TipoCampo campo) {
//Comprobamos posibles empates
vector <datosConcursante> empatados;
empatados.push_back(V[pos]);
int i=pos;
while ( (i>0) && igual(V[i-1],V[pos], campo)){
empatados.push_back(V[i-1]);
i--;
}
i=pos;
while ( (i<V.size()) && igual(V[i+1],V[pos],campo) ){
empatados.push_back(V[i+1]);
i++;
}
return empatados;
}
int ranking(int p, vector<datosConcursante>& V) {
int r=-1;
campoAOrdenar=puntos;
sort(V.begin(),V.end(),comparacion);
int posPhilipPorPuntos=buscarPorID(p,V);
vector <datosConcursante> empatadosPuntos;
empatadosPuntos=buscarEmpatados(posPhilipPorPuntos,V,puntos);
if (empatadosPuntos.size()==1) r = posPhilipPorPuntos+1;
else{
// Hay empates
vector <datosConcursante> empatadosProblemasresueltos;;
int posPhilipPorProblemasresueltos=buscarPorID(p,empatadosPuntos);
empatadosProblemasresueltos=buscarEmpatados(posPhilipPorProblemasresueltos,empatadosPuntos,problemasResueltos);
if (empatadosProblemasresueltos.size()==1) r = posPhilipPorPuntos+posPhilipPorProblemasresueltos+1;
else {
campoAOrdenar=id;
sort(empatadosProblemasresueltos.begin(),empatadosProblemasresueltos.end(),comparacion);
r=posPhilipPorPuntos+buscarPorID(p,empatadosProblemasresueltos)+1 + empatadosPuntos.size()-empatadosProblemasresueltos.size();
}
}
return r;
}
int main() {
int N,T,P; // N: Nº concursantes , T: Nº tareas, P: ID Philip
vector <int> puntosTareas; // Valor em puntos de cada tarea i 0=<i<=T-1
cin >> N >> T >> P;
vector <datosConcursante> dc(N);
int mCT[N][T]; // Matriz concursantes x Tareas
puntosTareas.assign(T,N); // Inicialmente cada tarea tendrá el total de puntos e
// iremos restando para cada concursante que la haya realizado
int tareaRealizada;
for(int concursante=0; concursante<N;++concursante){
for(int tarea=0; tarea<T;++tarea){
cin>>tareaRealizada;
mCT[concursante][tarea]=tareaRealizada;
puntosTareas[tarea]-=tareaRealizada;
dc[concursante].problemasResueltos+=tareaRealizada;
}
}
for(int concursante=0; concursante<N;++concursante){
dc[concursante].id=concursante+1;
for(int tarea=0; tarea<T;++tarea){
dc[concursante].puntos += mCT[concursante][tarea]*puntosTareas[tarea];
}
}
cout<<dc[P-1].puntos << " " << ranking(P,dc) << '\n' ;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |