1085 PAT单位排行题解C语言

题目描述
这道题花了我这个小菜鸡2个小时,最后依旧有两个数据运行超时,写篇博客记录一下解题时的心路历程,顺便问问大佬们怎么改能够运行正确的

//1085
//先计算出学校的加权总分,考生的准考证号仅用作计算,不用保存 
#include<cstdio>
#include<cstring>
#include<iostream> 
#include<algorithm>
#include<ctype.h>
#define stricmp strcasecmp //在pta上运行要加这一行 
using namespace std;

struct Student{
	char id[7];//准考证号
	int score;//得分
	char school[7];//学校 
}stu;

struct School{
	char name[7];//学校名
	int rank;
	double score;//加权总分
	int count;//考生总数 
}sch[100010];

//index与一些头文件里面的函数名一样了,得改改
int indexx(char* a, int len){//查找当前学生的学校是否已经在sch数组中 
	int i = 0;
	for(i = 0; i < len; i++){
		if(stricmp(a, sch[i].name)==0)//字符串比较 , stricmp不区分大小写 ,windows特有 
			return i;
	} 
	return -1;
}

bool cmp(School a, School b){
	if(a.score != b.score) return a.score > b.score;//先按加权总分降序排
	else if(a.count != b.count)  return a.count < b.count;//再按人数升序
	else return strcmp(a.name, b.name) > 0;//按名字字典序输出 
}

//全部改为小写 
char *strupr(char *str){
    char *orign=str;
    for (; *str!='\0'; str++)
        *str = tolower(*str);
    return orign;
}

int main(){
	int n, i = 0;
	scanf("%d", &n);
	while(n--){
		
		scanf("%s %d %s", stu.id, &stu.score, stu.school) ;
		int m = indexx(stu.school, i);
		//printf("%d\n", m);
		
		if(m==-1){//把当前学校信息添加到结构体中 
			strcpy(sch[i].name, stu.school);
			sch[i].count = 0;//数据初始化 
			sch[i].score = 0;
			switch (stu.id[0]){//计算学校总分 
				case 'A':
					sch[i].score += stu.score;//甲级 
					break;
				case 'B':
					sch[i].score += stu.score/1.5;//乙级
					break;
				case 'T':
					sch[i].score += stu.score*1.5;//顶级
					break; 
			}
			sch[i].count ++;//学生人数增加 
			i++;
		}
		
		else{//当前学校信息已经保存 
			switch (stu.id[0]){//计算学校总分 
				case 'A':
					sch[m].score += stu.score;//甲级 
					break;
				case 'B':
					sch[m].score += stu.score/1.5;//乙级
					break;
				case 'T':
					sch[m].score += stu.score*1.5;//顶级
					break; 
			}//switch
			sch[m].count ++;
		}//else
	}//while
	
	//printf("结构体长度:%d\n", i);
	int len = i;
	
	for(i = 0; i < len; i++){//得分取整数 
		sch[i].score = (int)sch[i].score;
	}
	
	//排序 
	sort(sch, sch + len, cmp);
	printf("%d\n", len);//输出单位个数
	//改变名次
	sch[0].rank = 1;
    printf("%d %s %.0f %d\n", sch[0].rank, strupr(sch[0].name), sch[0].score, sch[0].count);
	for(i = 1; i < len; i++){
		if(sch[i].score == sch[i-1].score){//与前一名得分一样,复制前一名的名词 
			sch[i].rank = sch[i-1].rank;
		}
		else{
			sch[i].rank = i + 1;
		}
        printf("%d %s %.0f %d\n", sch[i].rank, strupr(sch[i].name), sch[i].score, sch[i].count);
	}
	 
	return 0;
} 

运行结果

  1. 关于结构体
    这道题出现了两个变量,考生和单位,起初我把考生也定义了结构体数组,之后在计算的过程中发现,考生信息只是为了计算单位的得分还有人数,于是就不用数组,仅一个结构体,输入一个考生计算一次单位即可

  2. 关于一些字符串函数
    ①stricmp和strcasecmp:不区分大小写比较,windows下使用stricmp,linux下使用strcasecmp,在dev上运行得使用后者才能过
    ②strlwr:把字符串中得大写字母全部换为小写,但是在pta里面也用不了,就自己写了一个函数,*strupr来实现

  3. 关于sort函数
    胡凡的《算法笔记》讲的很详细,头文件algorithm

请大佬帮忙看看怎么改能够过后两个测试案例哇qaq

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值