2016-12-02

一次随堂测试参考程序

问题 A: 交换最小数

【题目描述】

输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数,若最小的数有多个只交换最前面的那个。

【输入】

输入有2行。第一行输入一个整数n,表示这个测试实例的数值的个数。第二行输入n个整数。

【输出】

输出交换后的数列。

【样例输入】

5

5 4 3 2 1

【样例输出】

1 4 3 2 5

【参考程序】
#include 

int main() {
    int n, min, a[100], i, t, e;
    while (scanf("%d", &n)) {
        if (n == 0)
            break;
        for (i = 0; i < n; i++)
            scanf("%d", &a[i]);
        min = a[0];
        t = 0;

        for (i = 1; i < n; i++)
            if (min > a[i]) {
                min = a[i];
                t = i;
            }
        a[t] = a[0];
        a[0] = min;

        for (e = 0, i = 0; i < n; i++) {
            if (e != 0)
                printf(" ");
            printf("%d", a[i]);
            e++;
        }
        printf("\n");
    }
    return 0;
}

问题 B: 精挑细选的钢管

【题目描述】

小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下:

1.这根钢管一定要是仓库中最长的;

2.这根钢管一定要是最长的钢管中最细的;

3.这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近)。

相关的资料倒是有,可是,手工从几百份钢管材料中选出符合要求的那根……要不,还是请你编写个程序来帮他解决这个问题吧。

【输入】

第一行一个整数T(0<T<50),表示仓库中所有钢管的数量。

之后有T行,每行三个整数,分别表示一根钢管的长度(以毫米为单位)、直径(以毫米为单位)和编码(一个9位整数)。

【输出】

一个9位整数,表示选出的那根钢管的编码。

【样例输入】

5

3000 50 872198442

3000 45 752498124

2000 60 765128742

3000 45 652278122

2000 50 781234556

【样例输出】

752498124

【参考程序】

(这题我没法通过循环变量做好控制所以采用结构体,但是考试时课程进度并没有到结构体,如果您只是通过循环就能控制好,期待倾听您的见解。)

#include 
#include 

#define MAX 1000
struct iron {
    int l;
    int d;
    int num;
} irons[MAX + 5];

int com(const void *a, const void *b) {
    struct iron *aa = (struct iron *) a;
    struct iron *bb = (struct iron *) b;
    if (aa->l == bb->l) {
        if (aa->d == bb->d)
            return bb->num - aa->num;
        else
            return aa->d - bb->d;
    } else
        return bb->l - aa->l;
}

void deal() {
    int n, i;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d%d%d", &irons[i].l, &irons[i].d, &irons[i].num);
    }
    qsort(irons, n, sizeof(irons[0]), com);
    printf("%d\n", irons[0].num);
}

int main() {
    deal();
    return 0;
}

问题 C: 最佳校友

【题目描述】

中国石油大学每年都会举办2次校友会,所有校友都有校友编号。每次到会的校友都在签到簿上写下自己的编号和姓名,在校友会成立15周年的聚会上将颁发“最佳校友奖”,该奖项颁发给到会次数最多的校友。现在请你编写程序,找出这个奖项的得主。若有多个校友并列第一,则均可获奖。

【输入】

输入若干个整数,表示签到簿上的校友编号,所有编号均为0~999的整数,以一个负数作为输入结束的标志。

【输出】

输出出现次数最多的编号。若获奖选手有多个,则按从小到大的顺序输出选手编号,用空格隔开。注意行末无空格。

【样例输入】

4 5 3 1 3 4 2 7 -1

【样例输出】

3 4

【参考程序】

#include 

int main() {
    int i, a[100] = {0}, max, f = 0;

    while (scanf("%d", &i) && i >= 0)
        a[i]++;

    for (i = 1, max = a[0]; i < 100; i++)
        if (max < a[i])
            max = a[i];

    for (i = 0; i < 100; i++) {
        if (a[i] == max) {
            if (f)
                printf(" %d", i);
            else
                printf("%d", i), f = 1;
        }
    }
    return 0;
}

问题 D: 公交车之谜

【题目描述】

听说青岛八大关公园有英语口语角,还有很多外国人呢。为了和老外对上几句,这周六早晨小胖拉上同伴早早的就坐上了72路公交从学校向紫荆山进发。一路上没事干,小胖开始思考一个问题。

从学校到青岛八大关公园共有n(1<=n<=20)站路,小胖刚上车时车上有m个人,每到一站都有pi个人上车,qi个人下车,问这一路上公车上最多有多少人。(0<=m, pi ,qi <=50).

【输入】

输入有多组样例,每组样例第一行两个数n m,接下来n行每行两个数pi和qi。

【输出】

每组实例输出这一路上(包含上车站点和下车站点)公交车上最多的人数。每组实例输出占一行。

【样例输入】

2 3

5 2

3 5

【样例输出】

6

【参考程序】
#include 

int main() {
    int a, b, max;
    int m, n;

    while (scanf("%d%d", &n, &m)) {
        max = m;
        while (n--) {
            scanf("%d%d", &a, &b);
            m += a - b;
            if (max < m)
                max = m;
        }
        printf("%d\n", max);
    }
    return 0;
}

以上即为这次随堂测试的几个题目,因为第五题与之前练习题重复,此处不再展示。

上面有一部分程序仅仅为了通过OJ的在线评测,有的可能设置了死循环(一直在读入),因为考试时间问题没有对循环次数进行必要的参数控制,欢迎各位在评论区给予补充,各位如果有更好的程序设计思想,欢迎在评论区进行展示。

没有评论:

发表评论