原题链接
思路
题目要求对每位考生的成绩计算其在本考点的排名以及其在所有考点中的排名。输出时按照分数从高到低排。如果分数相同,则名次也相同,输出时按注册号从小到大排列。
关键点主要是两个,一个是排序,一个是确定名次。其中排序可以借用 sort 方法,名次则是在已经排完序的列表中对分数进行比较来确定。具体代码如下:
完整代码
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
struct info
{
string rNum;
int score, fRank, lNum, lRank;
};
bool compare(info i1, info i2)
{
return i1.score == i2.score ? i1.rNum<i2.rNum : i1.score>i2.score; //先按分数从高到低排,如果分数相等按注册号从小到大排
}
int main()
{
vector<vector<info> > lLists;
vector<info> fList;
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
vector<info> lList;
int K;
cin >> K;
for (int j = 0; j < K; j++)
{
string rNum;
int score;
cin >> rNum >> score;
info nInfo;
nInfo.rNum = rNum;
nInfo.score = score;
nInfo.lNum = i + 1;
lList.push_back(nInfo);
}
sort(lList.begin(), lList.end(), compare);
int hScore = lList[0].score, hRank = 1; //初始化
for (int j = 0; j < lList.size(); j++)
{
if (lList[j].score == hScore) //如果分数和上一个相等
lList[j].lRank = hRank; //则名次也和上一个一样
else //否则
{
hScore = lList[j].score; //更新当前分数
lList[j].lRank = j + 1; //名次为其在数组中的下标加1
hRank = j + 1; //更新当前名次
}
}
lLists.push_back(lList);
}
for (int i = 0; i < lLists.size(); i++)
{
vector<info> list = lLists[i];
for (int j = 0; j < list.size(); j++)
fList.push_back(list[j]);
}
cout << fList.size() << endl;
sort(fList.begin(), fList.end(), compare);
int hScore = fList[0].score, hRank = 1; //确定全局名次,和本地名次类似
for (int i = 0; i < fList.size(); i++)
{
if (fList[i].score == hScore)
fList[i].fRank = hRank;
else
{
hScore = fList[i].score;
fList[i].fRank = i + 1;
hRank = i + 1;
}
cout << fList[i].rNum << ' ' << fList[i].fRank << ' ' << fList[i].lNum << ' ' << fList[i].lRank << endl;
}
return 0;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于