牛客网—计算机历年考研复试上机刷题记录

文章目录

    • 清华大学计算机考研复试上机题
      • 成绩排序
    • 哈尔滨工业大学计算机考研复试上机题
      • 字符串内排序
    • 浙江大学计算机考研复试上机题
      • EXCEL排序
    • 华中科技大学计算机考研复试上机题
      • 排序
      • 特殊排序

清华大学计算机考研复试上机题

成绩排序

本题要求获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。这里我使用了一个id标识符,表示输入顺序。

#include 
#include 
using namespace std;
struct student {
    char name[20];
    int id; //输入顺序 
    int score;
};
bool cmp0(struct student a, struct student b) {
    if (a.score != b.score) return a.score > b.score;
    else return a.id < b.id;  //相同成绩按先录入排列在前
}
bool cmp1(struct student a, struct student b) {
    if (a.score != b.score) return a.score < b.score;
    else return a.id < b.id;  //相同成绩按先录入排列在前
}
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int method;
        scanf("%d", &method);
        //getchar();
        struct student std[n];
        for (int i = 0; i < n; i++) {
        	std[i].id = i + 1; 
            scanf("%s%d", std[i].name, &std[i].score);
        }
        if (method) {
            sort(std, std + n, cmp1); //升序
        } else {
            sort(std, std + n, cmp0); //降序
        }
        for (int i = 0; i < n; i++) {
            printf("%s %d\n", std[i].name, std[i].score);
        }
    }
    return 0;
}

哈尔滨工业大学计算机考研复试上机题

字符串内排序

CodeUp应该也做过的题目。

#include 
#include 
#include 
using namespace std;

int main() {
    char s[250];
    while (gets(s)) {
        int len = strlen(s);
        sort(s, s + len);
        puts(s);
    }
    return 0;
}

浙江大学计算机考研复试上机题

EXCEL排序

CodeUp做过的题目。发现好些地方不太一样,提交了好几次才通过?……

  • CodeUp给的输入示例中最后结束是0 3,有两个输入,牛客网没有给出结束的示例,不太清楚。
  • CodeUp上面我使用while (scanf("%d%d", &N, &C), N) {...}的结构可以通过,但在牛客网上面没有通过,未能在规定时间内运行结束,需要写成while (scanf("%d", &n) != EOF && n)的结构。
  • 在多点测试中,如果可能申请的结构体数组太过庞大,可以在main函数/while循环外面申请而非每次循环申请一次;但很多时候,又要注意在每次循环后重置一下数组或变量,具体来说就是在while循环中申请数组或变量,或者在while循环外面申请变量,每次循环结束后/开始前重置数组或变量。这几种情况,需要我们自己判断。
  • CodeUp和牛客网的输出要求也不一样,到底哪个是真题呢?我有疑问?。
#include 
#include 
#include 
using namespace std;
struct student {
    int id;
    char name[12];
    int grade;
} stu[100050];

bool cmp1(struct student a, struct student b) {
    return a.id < b.id;
}
bool cmp2(struct student a, struct student b) {
    int t = strcmp(a.name, b.name);
    if (t != 0) return t < 0;
    else return a.id < b.id;
}
bool cmp3(struct student a, struct student b) {
    if (a.grade != b.grade) return a.grade < b.grade;
    else return a.id < b.id;
}

int main() {
    int n, c;
    while (scanf("%d", &n) != EOF && n) {
    	scanf("%d", &c);
        for (int i = 0; i < n; i++) {
            scanf("%d%s%d", &stu[i].id, stu[i].name, &stu[i].grade);
        }
        switch (c) {
            case 1: sort(stu, stu + n, cmp1); break;
            case 2: sort(stu, stu + n, cmp2); break;
            case 3: sort(stu, stu + n, cmp3); break;
        }
        printf("Case:\n");
        for (int i = 0; i < n; i++) {
            printf("%06d %s %d\n", stu[i].id, stu[i].name, stu[i].grade);
        }
    }
    return 0;
}

华中科技大学计算机考研复试上机题

排序

第一次发现竟然没有一个通过的……惊了,还以为我冒泡排序都会写错……结果发现格式不对劲,题中要求对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。每组测试数据的结果占一行。我少输出了结尾的空格?……题目中的n(1<=n<=100),使用冒泡排序达到万级别,没有超出百万级别达到千万级别,因此是可行的。

/* 1.1 */
#include 

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int a[n];
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        for (int i = n - 1; i >= 0; i--) {
            int flag = 0;
            for (int j = 0; j < i; j++) {
                if (a[j] > a[j + 1]) {
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                    flag = 1;
                }
            }
            if (flag == 0) break;
        }
        for (int i = 0; i < n; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    return 0;
}

如果修改n的范围,使其最大能够达到10000,那么冒泡排序就已经超过了百万数量级(10000*10000)而不应该被采用,我们需要使用快排、归并排序等O(nlogn)的算法,这里不要求我们手写,可以直接调用C++的库函数。

/* 1.2 */
#include 
#include 
using namespace std;
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int a[n];
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        sort(a, a + n);
        for (int i = 0; i < n; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    return 0;
}

特殊排序

CodeUp做过的题目,只不过在牛客网才发现原来是华科以前的题目啊。

#include 
#include 
using namespace std;

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int a[n];
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        if (n == 1) {
            printf("%d\n-1\n", a[0]);
            continue;
        }
        int max = 0;\
        for (int i = 1; i < n; i++) {
            if (a[i] > a[max]) max = i;
        }
        sort(a, a + n);
        printf("%d\n", a[n - 1]);
        for (int i = 0; i < n - 1; i++) {
            printf("%d", a[i]);
            if (i < n - 2) printf(" ");
            else printf("\n");
        }
    }
    return 0;
}

你可能感兴趣的:(牛客网)