一次随堂测试参考程序

问题 A: 交换最小数

【题目描述】

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

【输入】

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

【输出】

输出交换后的数列。

【样例输入】

5

5 4 3 2 1

【样例输出】

1 4 3 2 5

【参考程序】

#include <stdio.h>

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 <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
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 <stdio.h>
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的在线评测,有的可能设置了死循环(一直在读入),因为考试时间问题没有对循环次数进行必要的参数控制,欢迎各位在评论区给予补充,各位如果有更好的程序设计思想,欢迎在评论区进行展示。

分享