PTA 乙级 1080 MOOC期终成绩

时间:2019-02-15
本文章向大家介绍PTA 乙级 1080 MOOC期终成绩,主要包括PTA 乙级 1080 MOOC期终成绩使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

如果不借助bsearch()函数实在不会做到全对…

不借助快搜函数(超时一个测试点):

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

typedef struct
{
	char name[25]; int p, m, f, sum;
}grade;

int cmp(const void *a, const void *b)
{
	grade *aa = (grade*)a, *bb = (grade*)b;
	if ((aa->sum) != (bb->sum))
		return ((aa->sum) > bb->sum) ? -1 : 1;
	else
		return strcmp(aa->name, bb->name);
}

int main()
{
	int P, M, N, cnt = 0;
	grade *array;

	scanf("%d %d %d", &P, &M, &N);
	array = (grade*)malloc(sizeof(grade)*P);
	for (int i = 0; i < P; i++)
	{
		grade p;
		scanf("%s %d", p.name, &p.p);
		if (p.p >= 200)
			array[cnt++] = p;
	}
	for (int i = 0; i < cnt; i++)
		array[i].m = -1, array[i].f = -1, array[i].sum = 0;
	for (int i = 0; i < M; i++)
	{
		grade m;
		scanf("%s %d", m.name, &m.m);
		for (int j = 0; j < cnt; j++)
			if (strcmp(m.name, array[j].name) == 0)
			{
				array[j].m = m.m; break;
			}
	}
	for (int i = 0; i < N; i++)
	{
		grade n;
		scanf("%s %d", n.name, &n.f);
		for(int j=0;j<cnt;j++)
			if (strcmp(n.name, array[j].name) == 0)
			{
				array[j].f = n.f; break;
			}
	}
	for (int i = 0; i < cnt; i++)
		if (array[i].m > array[i].f)
		{
			double s = array[i].m*0.4 + array[i].f*0.6;
			if (((int)(s * 10) % 10) >= 5)
				array[i].sum = (int)s + 1;
			else
				array[i].sum = (int)s;
		}
		else array[i].sum = array[i].f;
	qsort(array, cnt, sizeof(grade), cmp);
	for (int i = 0; i < cnt; i++)
		if (array[i].sum >= 60)
			printf("%s %d %d %d %d\n", array[i].name, array[i].p, array[i].m, array[i].f, array[i].sum);

	return 0;
}

这是使用了C系统库函数bsearch()快搜函数的代码实现:

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

typedef struct
{
	char name[25]; int p, m, f, sum;
}grade;

int cmp(const void *a, const void *b)
{
	grade *aa = (grade*)a, *bb = (grade*)b;
	if ((aa->sum) != (bb->sum))
		return ((aa->sum) > bb->sum) ? -1 : 1;
	else
		return strcmp(aa->name, bb->name);
}

int cmp_name(const void *a, const void *b)
{
	grade *aa = (grade*)a, *bb = (grade*)b;
	return strcmp(aa->name, bb->name);
}

int cmp_bsearch(const void *a, const void *b)
{
	grade *aa = (char*)a, *bb = (grade*)b;
	return strcmp(aa, bb->name);
}

int main()
{
	int P, M, N, cnt = 0;
	grade *array;

	scanf("%d %d %d", &P, &M, &N);
	array = (grade*)malloc(sizeof(grade)*P);
	for (int i = 0; i < P; i++)
	{
		grade p;
		scanf("%s %d", p.name, &p.p);
		if (p.p >= 200)
			array[cnt++] = p;
	}
	for (int i = 0; i < cnt; i++)
		array[i].m = -1, array[i].f = -1, array[i].sum = 0;
	qsort(array, cnt, sizeof(grade), cmp_name);
	for (int i = 0; i < M; i++)
	{
		grade m, *t;
		scanf("%s %d", m.name, &m.m);
		t = bsearch(m.name, array, cnt, sizeof(grade), cmp_bsearch);
		if (t != NULL)
			t->m = m.m;
	}
	for (int i = 0; i < N; i++)
	{
		grade n, *t;
		scanf("%s %d", n.name, &n.f);
		t = bsearch(n.name, array, cnt, sizeof(grade), cmp_bsearch);
		if (t != NULL)
			t->f = n.f;
	}
	for (int i = 0; i < cnt; i++)
		if (array[i].m > array[i].f)
		{
			double s = array[i].m*0.4 + array[i].f*0.6;
			if (((int)(s * 10) % 10) >= 5)
				array[i].sum = (int)s + 1;
			else
				array[i].sum = (int)s;
		}
		else array[i].sum = array[i].f;
	qsort(array, cnt, sizeof(grade), cmp);
	for (int i = 0; i < cnt; i++)
		if (array[i].sum >= 60)
			printf("%s %d %d %d %d\n", array[i].name, array[i].p, array[i].m, array[i].f, array[i].sum);

	return 0;
}