字符串排序c语言1201,中科大oj 1201 GPA

//为了尽可能提高效率

//使用c语言输入输出,并且使用c字符串和内联函数

//将学生和课程进行编号和排序,通过二分搜索来查找

//再分别同数组存储分数,学分,总分,平均分等信息

#include

#include

#include

using namespace std;

class Unite{//将字符串编号

public:

char* str;//字符串

int id;//相应的编号

};

int n, m, q;

Unite *stu_id[501], *cou_id[501];

inline int stu_getid(char*);//获得学生id

inline int cou_getid(char*);//获得课程id

bool compare(Unite*, Unite*);//比较函数,用于排序

double gpa[101]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1.3, 1.3, 1.3, 1.5, 1.7, 1.7, 1.7, 2, 2, 2, 2, 2.3, 2.3, 2.3, 2.7, 2.7, 2.7, 3, 3, 3, 3, 3.3, 3.3, 3.3, 3.7, 3.7, 3.7, 3.7, 3.7, 4, 4, 4, 4, 4, 4.3, 4.3, 4.3, 4.3, 4.3, 4.3};

//开一个101大小的数组,存储每个分数对应的gpa

int main(){

scanf("%d%d%d", &n, &m, &q);

double total_credit[n];//总学分

double ave_grade[n];//总成绩

double ave_gpa[n];//总gpa

for(int i = 0; i < n; i++){//初始化学生信息

total_credit[i] = 0.0;

ave_grade[i] = 0.0;

ave_gpa[i] = 0.0;

char* id = new char[11];

scanf("%s", id);

stu_id[i] = new Unite;

stu_id[i]->str = id;

stu_id[i]->id = i;

}

sort(stu_id, stu_id + n, compare);//排序

double total_stu[m];//总学生数

double credit[m];//课程对应学分

double total_grade[m];//总分数

for(int i = 0; i < m; i++){//初始化课程信息

total_stu[i] = 0;

total_grade[i] = 0;

char* id = new char[11];

double c;

scanf("%s%lf", id, &c);

cou_id[i] = new Unite;

cou_id[i]->str = id;

cou_id[i]->id = i;

credit[i] = c;

}

sort(cou_id, cou_id + m, compare);//排序

double score[n][m];

for(int i = 0; i < n; i++){

for(int j = 0; j < m; j++){

score[i][j] = 0;

}

}

for(int i = 0; i < q; i++){//查找

char choice[11];

scanf("%s", choice);

if(strcmp(choice, "score") == 0){

char id_1[11], id_2[11];

double grade;

scanf("%s%s%lf", id_1, id_2, &grade);

int num_1 = stu_getid(id_1);

int num_2 = cou_getid(id_2);

score[num_1][num_2] = grade;

total_credit[num_1] += credit[num_2];

ave_grade[num_1] += grade * credit[num_2];

ave_gpa[num_1] += gpa[(int)grade] * credit[num_2];

total_grade[num_2] += grade;

total_stu[num_2]++;

}else if(strcmp(choice, "student") == 0){

char id[11];

scanf("%s", id);

int ID = stu_getid(id);

double num_1 = total_credit[ID] == 0 ? 0 : ave_grade[ID] / total_credit[ID];

double num_2 = total_credit[ID] == 0 ? 0 : ave_gpa[ID] / total_credit[ID];

printf("%.2lf %.2lf\n", num_1, num_2);

}else if(strcmp(choice, "course") == 0){

char id[11];

scanf("%s", id);

int ID = cou_getid(id);

double num = total_stu[ID] == 0 ? 0 : total_grade[ID] / total_stu[ID];

printf("%.2lf\n", num);

}else{

char id_1[11], id_2[11];

scanf("%s%s", id_1, id_2);

int ID_1 = stu_getid(id_1);

int ID_2 = cou_getid(id_2);

printf("%.0lf %.2lf\n", score[ID_1][ID_2], gpa[(int)score[ID_1][ID_2]]);

}

}

return 0;

}

inline int stu_getid(char* str){//二分查找

int left = 0;

int right = n - 1;

while(left <= right){

int mid = left + ((right - left) >> 1);

if (strcmp(str, stu_id[mid]->str) < 0) right = mid - 1;

else if (strcmp(str, stu_id[mid]->str) > 0) left = mid + 1;

else return stu_id[mid]->id;

}

return -1;

}

inline int cou_getid(char* str){//二分查找

int left = 0;

int right = n - 1;

while(left <= right){

int mid = left + ((right - left) >> 1);

if (strcmp(str, cou_id[mid]->str) < 0) right = mid - 1;

else if (strcmp(str, cou_id[mid]->str) > 0) left = mid + 1;

else return cou_id[mid]->id;

}

return -1;

}

bool compare(Unite* u_1, Unite* u_2){

return strcmp(u_1->str, u_2->str) < 0;//strcmp是可以按照字典序排序的

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值