1025 PAT Ranking (25分)

其他测试点通过,但是测试点三无法通过要么是
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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值