PAT A1025 PAT Ranking (25分)

(推荐个截图神器,fireshot

win+shift+s并不好用,因为它不能截长图)

自己做的和标准答案差不多,些微不同。几个出错的点:

1.题目数量要求没看仔细,n个考场,每个考场m个考生,总人数我居然直接用m大小的数组存了。

2.打印的时候,总人数count又是忘记打了,OJ显示所有答案错误,检查了半天才发现 ( ̄▽ ̄)"

AC代码:

//A1025 PAT Ranking (25分) https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct patest {
	char sn[14];
	int f_rank;
	int loc;
	int l_rank;
	int score;
}pat[30010];//总数是3w,看清楚了,要乘一下的
bool cmp(patest p1,patest p2)
{
	if (p1.score != p2.score) return p1.score > p2.score;
	else {
		return strcmp(p1.sn, p2.sn) < 0;
	}
}
void print_ranklist(patest *p,int n)
{
	printf("%d\n", n);
	for (int i = 0; i < n; i++) {
		printf("%s %d %d %d\n", p[i].sn, p[i].f_rank, p[i].loc, p[i].l_rank);
	}
}
void init(patest *p, char* s, int score, int loc)
{
	strcpy(p->sn, s);
	p->score = score;
	p->loc = loc;
}
int main()
{
	int N, count = 0;//count为总人数计数
	int left, right;
	scanf("%d", &N);
	for(int i=1;i<=N;i++)
	{
		int num;
		scanf("%d", &num);
		left = count;
		for (int j = 0; j < num; j++) {//读取一个loc的数据
			int score;
			char s[14] = { 0 };
			scanf("%s", s);
			scanf("%d", &score);
			init(pat+count, s, score, i);
			count++;
		}
		right = count;
		sort(pat + left, pat + right, cmp);
		pat[left].l_rank = 1;//排序出l_rank
		for (int i = left+1; i < right; i++) {
			if (pat[i].score == pat[i - 1].score)
				pat[i].l_rank = pat[i - 1].l_rank;
			else
				pat[i].l_rank = i-left+ 1;//i-left为组中下标
		}
	}
	sort(pat, pat + count, cmp);//排序出f_rank
	pat[0].f_rank = 1;
	for (int i = 1; i < count; i++) {
		if (pat[i].score == pat[i - 1].score)
			pat[i].f_rank = pat[i - 1].f_rank;
		else
			pat[i].f_rank = i + 1;
	}
	print_ranklist(pat, count);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值