PAT1085,运行超时

xiaoxiao2021-02-28  56

写的过程中遇到了许多问题,至今还没解决,首先这个是我的c语言代码,运行超时

#include<stdio.h>

#include<malloc.h> #include<string.h> typedef struct student{ char school[7]; int score; int people; }*STU,stu; int Bi_Jiao(STU A, int  **num, int f, int p); void Q_Sort(STU A, int  **num, int L,int R); void Translate_Name(char *A); int Find_Same(char *A, char *co); int Get_Score(char *A, int sco); int main() { int n = 0;// 学校数量 int N; // 学生人数     int is_find = 0;     scanf("%d",&N);           // 是否找到相同学校标记,找到置1 // 暂时保存录入的学生信息 char sch[7]; // 考生学校 char id[7];  // 考生学号 int sco;    // 考生成绩 int i, k, j;     STU A = (STU) malloc(N*sizeof(stu)); // 以下为录入学生信息 for ( i = 0; i < N; ++i) {         is_find = 0; scanf("%s",id); scanf("%d",&sco); scanf("%s",sch); sco = Get_Score(id, sco);    // 分数转换 Translate_Name(sch);         // 学校名转换成小写 for (k = 0; k < n; ++k){     // 找是否有相同的学校 if (Find_Same(A[k].school, sch)) { A[k].people++;       // 人数加一   A[k].score += sco;   // 分数整合 is_find = 1;         // 找到学校置1 break; } } if (!is_find) {    // 如果没有找到    for(j = 0;sch[j] != '\0';++j)                 A[k].school[j] = sch[j]; // 初始化学校             A[k].school[j] = '\0'; A[k].people = 1;   // 初始化学校考生数 A[k].score = sco;  // 初始化分数 n++;               // 更新总学校数 } } // 以上为录入学生信息 int **num = (int **)malloc(2*sizeof(int *)); // 用来存储学校的排名与下表信息,排序只交换数组下标 num[0] = (int *)malloc(n*sizeof(int)); num[1] = (int *)malloc(n*sizeof(int)); for ( i = 0; i < n; ++i) { num[0][i] = i;     // 存储学校数组下标 num[1][i] = i + 1; // 存储学校名次 } Q_Sort(A ,num ,0 ,n-1 ); // 把数据进行排序 printf("%d\n",n); for ( i = 1; i < n; ++i) { if (A[num[0][i]].score == A[num[0][i - 1]].score) { num[1][i] = num[1][i - 1]; } } for ( i = 0; i < n; ++i) {             printf("%d %s %d %d\n", num[1][i],A[num[0][i]].school,A[num[0][i]].score,A[num[0][i]].people ); // cout << num[1][i] << " " << A[num[0][i]].school << " " << A[num[0][i]].score << " " << A[num[0][i]].people << endl; } free(num[0]); free(num[1]); free(num); free(A);     return 0; } // 分数转化 int Get_Score(char *A, int sco) { if ('T' == A[0]) return (sco * 1.5); else if ('B' == A[0]) return (sco / 1.5); else return sco; } // 查找是否有相同的学校 int Find_Same(char *A, char  *co) { int i; for(i = 0; A[i] != '\0' && co[i] != '\0';++i)         if(A[i] != co[i])             return 0;     if(A[i] == '\0' && co[i] == '\0')         return 1;     return 0; } // 把学校名翻译成小写 void Translate_Name(char *A) {     int i; for ( i = 0; A[i] != '\0'; ++i) if (A[i] < 'a') A[i] += 32; } // 快速排序:因为来回交换数据太过麻烦,所以我交换了数据对应的下标,并且用数组num存储 void Q_Sort(STU A, int **num, int L,int R) { if (L < R) { int temp = num[0][L]; // 把待排数组第一个元素拿出 int l = L; int r = R; while (l < r) {       // l < r 循环 while (l < r && Bi_Jiao(A,num, r,temp)) r--; if(l < r)   num[0][l++] = num[0][r]; while (l < r && !Bi_Jiao(A, num,l , temp)) l++; if(l < r) num[0][r--] = num[0][l]; } num[0][l] = temp; Q_Sort(A, num, L,l-1 ); // 左边排序 Q_Sort(A, num, l+1, R); // 右边排序 } }  // 确定两个元素的大小关系 int  Bi_Jiao(STU A, int **num, int f, int p) { if (A[num[0][f]].score < A[p].score) return 1; else if ((A[num[0][f]].score == A[p].score) && (A[num[0][f]].people > A[p].people)) return 1; else if ((A[num[0][f]].score == A[p].score) && (A[num[0][f]].people == A[p].people) && (strcmp(A[num[0][f]].school,A[p].school) > 0) ) return 1; else return 0;

}

提交结果运行超时

下面是我之前用C++写的,也是出现了运行超时的问题,刚开始我用的是冒泡排序,运行超时;看了百度的解释说冒泡排序不行,然后自己写了一个快速排序,但是还是运行超时

#include<iostream>#include<string>using namespace std;typedef struct student{ string school; int score; int people;}*STU,stu;bool Bi_Jiao(STU A, int ** &num, int f, int p);void Q_Sort(STU A, int ** &num, int L,int R);void Translate_Name(string &A);bool Find_Same(string A, string co);int Get_Score(string A, int sco);int main(){ int n = 0;// 学校数量 int N; // 学生人数  cin >> N; STU A = new stu[N]; // 暂时保存录入的学生信息 string sch; // 考生学校 string id;  // 考生学号 int sco;    // 考生成绩 // 以下为录入学生信息 for (int i = 0,k; i < N; ++i) { cin >> id;  cin >> sco; cin >> sch; sco = Get_Score(id, sco);    // 分数转换 Translate_Name(sch);         // 学校名转换成小写 int is_find = 0;             // 是否找到相同学校标记,找到置1 for (k = 0; k < n; ++k){     // 找是否有相同的学校 if (Find_Same(A[k].school, sch)) {   A[k].people++;       // 人数加一  A[k].score += sco;   // 分数整合 is_find = 1;         // 找到学校置1 break; } } if (!is_find) {        // 如果没有找到 A[k].school = sch; // 初始化学校 A[k].people = 1;   // 初始化学校考生数 A[k].score = sco;  // 初始化分数 n++;               // 更新总学校数 } } // 以上为录入学生信息 int **num = new int*[2]; // 用来存储学校的排名与下表信息,排序只交换数组下标 num[0] = new int[n]; num[1] = new int[n]; for (int i = 0; i < n; ++i) { num[0][i] = i;     // 存储学校数组下标 num[1][i] = i + 1; // 存储学校名次 } Q_Sort(A ,num ,0 ,n-1 ); // 把数据进行排序 cout << n << endl; for (int i = 1; i < n; ++i) { if (A[num[0][i]].score == A[num[0][i - 1]].score) { num[1][i] = num[1][i - 1]; } } for (int i = 0; i < n; ++i) { cout << num[1][i] << " " << A[num[0][i]].school << " " << A[num[0][i]].score << " " << A[num[0][i]].people << endl; } delete [] num[0]; delete [] num[1]; delete [] num; delete [] A;    return 0;}int Get_Score(string A, int sco){ if ('T' == A[0]) return (sco * 1.5); else if ('B' == A[0]) return (sco / 1.5); else return sco;}bool Find_Same(string A, string co){ if (A == co) return true; else return false;}void Translate_Name(string &A){ for (int i = 0; A[i] != '\0'; ++i) if (A[i] < 'a') A[i] += 32;}void Q_Sort(STU A, int ** &num, int L,int R){ if (L < R) { int temp = num[0][L]; // 把待排数组第一个元素拿出 int l = L; int r = R; while (l < r) {       // l < r 循环 while (l < r && Bi_Jiao(A,num, r,temp)) r--; if(l < r)  num[0][l++] = num[0][r]; while (l < r && !Bi_Jiao(A, num,l , temp)) l++; if(l < r) num[0][r--] = num[0][l]; } num[0][l] = temp;     Q_Sort(A, num, L,l-1 ); // 左边排序 Q_Sort(A, num, l+1, R); // 右边排序 }}bool Bi_Jiao(STU A, int ** &num, int f, int p){ if (A[num[0][f]].score < A[p].score) return true; else if ((A[num[0][f]].score == A[p].score) && (A[num[0][f]].people > A[p].people)) return true; else if ((A[num[0][f]].score == A[p].score) && (A[num[0][f]].people == A[p].people) && (A[num[0][f]].school > A[p].school)) return true; else return false;}

急求大佬能帮帮忙!!!

转载请注明原文地址: https://www.6miu.com/read-2622490.html

最新回复(0)