这道题花了我这个小菜鸡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;
}
-
关于结构体
这道题出现了两个变量,考生和单位,起初我把考生也定义了结构体数组,之后在计算的过程中发现,考生信息只是为了计算单位的得分还有人数,于是就不用数组,仅一个结构体,输入一个考生计算一次单位即可 -
关于一些字符串函数
①stricmp和strcasecmp:不区分大小写比较,windows下使用stricmp,linux下使用strcasecmp,在dev上运行得使用后者才能过
②strlwr:把字符串中得大写字母全部换为小写,但是在pta里面也用不了,就自己写了一个函数,*strupr来实现 -
关于sort函数
胡凡的《算法笔记》讲的很详细,头文件algorithm
请大佬帮忙看看怎么改能够过后两个测试案例哇qaq