题目
生词生句
- Each test is supposed to run simultaneously in several places,
每个测试应该同时在几个地方运行
思路
先局部排序,再总体排序,注意排序函数引用传参
代码
#include <iostream>
#include <string>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<list>
#include<sstream>
using namespace std;
#define nmax 100
#define inf 999999
typedef struct
{
long long ID;
int score;
int location_number;
int locate_rank;
int final_rank;
}Info;
vector<Info> all;
int n;
int num;
int sum = 0;
bool cmp(const Info& a, const Info& b)
{
if (a.score != b.score)
return a.score > b.score;
else
return a.ID < b.ID;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> num;
sum += num;
vector<Info> vec;
for (int j = 0; j < num; ++j)
{
Info info;
cin >> info.ID;
cin >> info.score;
info.location_number = i;
vec.push_back(info);
}
sort(vec.begin(), vec.end(), cmp);
for (int j = 0;j < vec.size(); ++j)
{
if (j!=0 && vec[j].score == vec[j - 1].score)
vec[j].locate_rank = vec[j - 1].locate_rank;
else
vec[j].locate_rank = j + 1;
}
//第一次,直接插入
if (i == 1)
all.assign(vec.begin(), vec.end());
//否则需要合并
else
{
all.insert(all.end(), vec.begin(), vec.end());
}
}
sort(all.begin(), all.end(), cmp);
//输出
cout << sum << endl;
for (int i = 0; i < all.size(); ++i)
{
if (i != 0 && all[i].score == all[i - 1].score)
all[i].final_rank = all[i - 1].final_rank;
else
all[i].final_rank = i+1;
printf("%.13lld %d %d %d\n", all[i].ID, all[i].final_rank, all[i].location_number, all[i].locate_rank);
}
return 0;
}