解题思路:


        主要用到atoi()函数和qsort()函数,atoi()计耗时,qsort()排序。

        每输入一道题的提交状态就进行一次判断,不必全部存放再判断。

参考代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Stu {
	char name[11]; // 名字
	int score; // 得分
	int ptime; // 耗时
} Stu;

int cmp(const void *a, const void *b) {

	Stu *c = (Stu *)a;
	Stu *d = (Stu *)b;

	if (c->score != d->score) return d->score - c->score; // 若得分不同时,按得分降序

	if (c->ptime != d->ptime) return c->ptime - d->ptime; // 否则,若耗时不同,按罚时升序

	return strcmp(c->name, d->name); // 否则,按名字字典序
}

void Judge(Stu *stu, char *tmp, int m) {

	if (tmp[0] == '-' || tmp[0] == '0') return; // WA或提交0,不计
        
        // AC
	stu->score++; // 得分++
	stu->ptime += atoi(tmp); // 先计耗时

	if (strlen(tmp) >= 4) { // 由题意,AC耗时小于1000,len >=4 为x(x)的情况

		int i = 0;
		while (tmp[++i] != '('); // 找到左括号位置i
		stu->ptime += atoi(tmp + i + 1) * m; // 计罚时
	}
}

int main()
{
	Stu stus[1000];
	int i, n, m, total = 0;
	char tmp[10];

	scanf("%d%d", &n, &m);
	getchar();
	while (scanf("%s", stus[total].name) != EOF) {

		stus[total].score = 0;
		stus[total].ptime = 0;
		for (i = 0; i < n; i++) {

			scanf("%s", tmp);
			Judge(&stus[total], tmp, m);
		}
		getchar();
		total++;
	}
	qsort(stus, total, sizeof(stus[0]), cmp);

	for (i = 0; i < total; i++) {

		printf("%-10s %2d %4d\n", stus[i].name, stus[i].score, stus[i].ptime);
	}
	return 0;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论