其他测试点通过,但是测试点三无法通过要么是
1.效率不过关,建议用STL里面的sort排序。
2.使用long long 保存ID,但是忽略了控制输出格式,如00012需要控制前置输出0.
3.此处提供一种思路,读者可以尝试。
用结点数组struc保存 id,grade,index(考场编号)
按总成绩排序,确定了最终排名。
遍历一遍,按同考场人员出现先后次序排名标号,确定同场顺序。
这样应该效率会高很多,节省了很多时间。
附本人AC代码(非上述思想,最后一个测试点超时的边缘。)
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct Node {
int grade, index, lrank, frank;
};
map<long long,Node>ans;
vector<long long>V[101],res;
bool cmp(long long&A, long long&B) {
return ans[A].grade == ans[B].grade ? A<B : ans[A].grade>ans[B].grade;
}
int main() {
int N, M, grade;
Node tmp;
long long id;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &M);
for (int j = 0; j < M; j++) {
scanf("%lld %d", &id, &tmp.grade);
tmp.index = i+1;
ans[id] = tmp;
V[i + 1].push_back(id);
res.push_back(id);
}
sort(V[i + 1].begin(), V[i + 1].end(), cmp);
ans[V[i + 1][0]].lrank = 1;
for (int j = 1; j < V[i + 1].size(); j++) {
if (ans[V[i + 1][j]].grade == ans[V[i + 1][j - 1]].grade)ans[V[i + 1][j]].lrank = ans[V[i + 1][j - 1]].lrank;
else ans[V[i + 1][j]].lrank = j + 1;
}
}
sort(res.begin(), res.end(),cmp);
ans[res[0]].frank = 1;
for (int i = 1; i < res.size(); i++) {
if (ans[res[i]].grade == ans[res[i - 1]].grade)ans[res[i]].frank = ans[res[i - 1]].frank;
else ans[res[i]].frank = i + 1;
}
printf("%d\n", ans.size());
printf("%013lld %d %d %d\n", res[0], ans[res[0]].frank, ans[res[0]].index,ans[res[0]].lrank);
for (int i = 1; i < ans.size(); i++) {
printf("%013lld %d %d %d\n", res[i], ans[res[i]].frank, ans[res[i]].index,ans[res[i]].lrank);
}
return 0;
}