软件期末热身题

问题 A: 密码破译

【题目描述】

中国石油大学ACM俱乐部小武学长的字符串处理功力在ACM界无人不知无人不晓。今天,高老板从小武学长那借到了一本秘籍。高老板非常兴奋,打开书的第一章,页首写着26个字母“IUJTMFHXOKBQEAPZCDWRYNVSGL”,对应的英文字母是“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,此书根据此字母表编写,需要翻译后查看。高老板为了练就小武学长的神功,请你为他写一个程序,以便翻译书上内容。

【输入】

输入有多行。第一行包含一个整数n(1<=n<=100),代表需要翻译的串的数目。

接下来的n行,每行输入小武学长的秘籍原文,格式为一行字符串,仅由26个大写字母组成,长度不超过100。

【输出】

输出对应有n行,对于每个输入的字符串,输出翻译后的内容。

【样例输入】

2
XMQQP
IJE

【样例输出】

HELLO
ACM

【参考程序】

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    char secret[]={'I','U','J','T','M','F','H','X','O','K','B','Q','E','A','P','Z','C','D','W','R','Y','N','V','S','G','L'};
    char read[150];
    
    int n;
    scanf("%d",&n);
    getchar();
    
    while (n--)
    {
        gets(read);
        for (int i=0; i<strlen(read); i++)
            for (int j=0; j<26; j++)
                if (read[i]==secret[j])
                    printf("%c",'A'+j);
        putchar('\n');
    }

    return 0;
}

问题 B: 乘坐高铁需要多少钱

【题目描述】

石油附小一年级的小朋友们盼望已久的寒假马上到了,家长们为了奖励孩子这半年的良好表现,纷纷要带他们坐高铁去旅行。请编写程序,读入小朋友的身高和普通票价,计算该名儿童乘坐高铁的实际花费。

根据有关规定,儿童身高不足1.2米的,免费乘坐;身高为1.2(含)~1.5米(含)的,须购买半价票;超过1.5米的,须购买全价票。

【输入】

仅有一行,包括两个数据:整数h表示儿童身高(单位厘米)和实数p表示普通票价(单位元),以空格隔开。

【输出】

一行,输出儿童乘坐火车的花费,保留两位小数,以换行符结束。

【样例输入】

125 314

【样例输出】

157.00

【参考程序】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int height;
    double price;
    
    scanf("%d%lf",&height,&price);
    
    if (height<120)
        printf("0.00\n");
    else if(height<=150)
        printf("%.2lf\n",price*0.5);
    else
        printf("%.2lf\n",price);

    return 0;
}

问题 C: 中外文化差异

【题目描述】

中国人先读姓,后读名,以示对我们祖先的尊重。而我们可爱的外国友人都是先读名,后读姓。中外文化的差异造成了极大的麻烦。当你发表一篇国际论文的时候,总是被姓和名的顺序所烦恼。你写个程序,帮帮大家吧。

【输入】

多组测试用例,每组一行,每行两个单词,第一个是姓,第二个是名

【输出】

对应每行输出一个结果,先写名,后写姓,空格分开

【样例输入】

lincoln isabel

【样例输出】

isabel lincoln

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    char a[200],b[200];
    while(scanf("%s %s",a,b)!=EOF)
        printf("%s %s\n",b,a);
    return 0;
}

问题 D: GLB串

【题目描述】

只要一个字符串中包含大写“GLB”,高老板就认为这是一个GLB串。现在给你一些字符串,请你帮高老板判断这些字符串是不是GLB串。

【输入】

首先是一个整数T,表示T行数据,每行一个字符串(只包括大小写字母),长度小于100。

【输出】

如果是高老板串输出YES,否则输出NO。

【样例输入】

3
GLBSHIGEmaiIPADMINI4detuhao
wobushiGlb
hahaha

【样例输出】

YES
NO
NO

【参考代码】

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    getchar();
    
    while (n--)
    {
        char str[150];
        scanf("%s",str);
        char* p=strstr(str,"GLB");
        if (p!=NULL)
            printf("YES\n");
        else
            printf("NO\n");
    }
    
    return 0;
}

问题 E: 训练时间

【题目描述】

春季运动会开幕式要进行团体操表演,于是喜羊羊召集大家紧锣密鼓地训练了起来,懒羊羊也在被召集之列。喜羊羊规定了每天的训练时间,只准早到,不许迟到,而且喜羊羊会做相关记录。这下懒羊羊可惨了,他虽然设定了闹钟,可是他动作慢,老迟到。 现给出若干天的规定到场时间与懒羊羊的到场时间记录,判断每天懒羊羊有无及时赶到训练场,以及迟到或早到的时间。

【输入】

每两行时间为一组,每组中的第一行时间为规定的训练时间,第二行为懒羊羊到达训练场的时间。每行有两个整数H和M,H是以24小时记时法表示的小时数(0 <= H <= 24),M表示分钟数(0 <= M <= 59)。每组中的两个时间表示的是同一天的两个时间。若干组时间后以-1表示结束。

【输出】

若干行,如果这一天懒羊羊及时到达了训练场,则输出‘Yes’及早到的分钟数;如果没有及时到达,则输出‘No’及迟到的分钟数。

【样例输入】

14 30
14 25
8 0
9 0
13 10
12 50
7 25
7 25
-1

【样例输出】

Yes 5
No 60
Yes 20
Yes 0

【参考代码】


#include <stdio.h>

int main(int argc, const char * argv[]) {
    while (1)
    {
        int a,b,c,d;

        scanf("%d %d",&a,&b);
        scanf("%d %d",&c,&d);
        
        if (a==-1)
            break;
            
        int m,n;
        m=a*60+b;
        n=c*60+d;
        
        if (m>=n)
            printf("Yes %d\n",m-n);
        else
            printf("No %d\n",n-m);
        
    }
        
    return 0;
}

问题 F: 中超联赛

【题目描述】

中超联赛拥有大量的现场观众和收视观众,球迷都渴望观看比赛,同时希望能有一个平台更深度的了解中超联赛,体验中超球队的辛苦和努力。每场足球比赛历时90分钟,分为上半场和下半场。
中超的积分规则如下:赢得一场比赛得3分,平一场得1分,输球不得分。例如一个球队的胜平负的场次分别为11 2 2,那么积分就是11*3+2*1=35。今年的中超联赛已经落下帷幕,请你帮忙计算出各球队的总积分并按照积分给出球队最终的排名吧!

【输入】

输入有多行。第一行是球队数量n(1<n<=16)

接下来有n行,每行数据包含球队的名称(不含空格,长度不超过30个字符)和胜、平、负的场次,数据间以空格分开

【输出】

输出各个球队按照积分的排名情况(保证所有球队的积分各不相同) ,每行输出球队的名次、名称和该队的积分,数据间用一个空格分开,每行末尾没有空格

【样例输入】

3
shanghaishanggang 11 2 2
beijingguoan 12 2 1
shandonglunengtaishan 10 1 4

【样例输出】

1 beijingguoan 38
2 shanghaishanggang 35
3 shandonglunengtaishan 31

【参考代码】

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    char name[50];
    int g,s,c,score;
}QD;

int cmp(const void *a, const void *b)
{
    return (*(QD*)b).score - (*(QD*)a).score;
}

int main(int argc, const char * argv[]) {
    int n,t;
    QD team[30];
    scanf("%d",&n);
    getchar();
    t=n;
    
    int i=0;
    while (n--)
    {
        scanf("%s",team[i].name);
        scanf("%d",&team[i].g);
        scanf("%d",&team[i].s);
        scanf("%d",&team[i].c);
        team[i].score=team[i].g*3+team[i].s;
        i++;
    }
    
    qsort(team,t,sizeof(QD),cmp);
    
    i=0;
    while (t--)
    {
        printf("%d ",i+1);
        printf("%s ",team[i].name);
        printf("%d\n",team[i].score);
        i++;
    }
    return 0;
}

问题 G: 谁是猪

【题目描述】

拱猪是四人一副扑克的经典游戏,游戏有特殊的计分方法,若是同学们编过此类代码(如知码网选做题涉及过),一定痛不欲生。好啦!这回老师降低难度,玩家数量随意N(1<=N<=10),只要谁手里最后最后握有Q,谁就是猪!

【输入】

输入有多组数据,代表每个玩家最后持有的牌(2~9,A,J,Q,K,大王用空格表示,小王用*表示,不考虑小写字符和10)。每人持牌总数不超过52,且至少持有一张。所有组保证必有且只有一张Q。

【输出】

一个整数,表示第几个玩家是猪,从1开始。

【样例输入】

234AJK7788QA
K 78
*J

【样例输出】

1

【参考代码】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    char s[100];
    int j=0;
    while (gets(s)!=NULL)
    {
        for (int i=0; i<strlen(s); i++)
            if (s[i]=='Q')
            {
                printf("%d",j+1);
                exit(0);
            }
        j++;
        
    }
    return 0;
}

问题 H: 又要种树?

【题目描述】

小黄山上的树在石油大学已经成为程序设计题目中家喻户晓的“明星”了。明年春天植树节之前,CFun群发起了对树种选择的投票,每人每次只能投一种树。拟种植的共有三种候选树木:法桐,银杏,松树。只有票数达到75%及以上的树才能种植。如果票数达不到,就重新投票,直到有票数达到75%为止。现在LGJ已经把投票结果进行了汇总,请你编个程序帮他算一下该选择哪一种吧。

【输入】

任意三个非负整数,分别表示法桐、银杏、松树的得票数。

【输出】

输出选择的树种的英文名称。

【样例输入】

23 200 30

【样例输出】

Ginkgo

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    
    int max=a;
    char flag='a';
    
    if (b>max)
        max=b,flag='b';
    
    if (c>max)
        max=c,flag='c';
    
    switch (flag)
    {
        case 'a':
            printf("Platanus orientalis");
            break;
        case 'b':
            printf("Ginkgo");
            break;
        case 'c':
            printf("Pine");
            break;
    }
    
    
    return 0;
}

问题 I: 最佳校友

详见:http://liumengxiao.cn/articles/anwser_to_test1/
问题:C

问题 J: Xman修剪花圃

【题目描述】

你知道吗?在外国,如果你不修剪你的花圃,是要被贴罚单的。Xman忙于战斗,被贴了好多罚单。这一次好不容易休息了,他决定修剪一下。修剪成什么样子呢?当然是X形。

Xman的花圃是一个n*n的正方形,其中n为大于等于3的正奇数。在每个位置上都有一株植物,对应的正整数是该植物的高度h。Xman的修剪策略是,首先把不在两条对角线上的植物通通铲光,然后在对角线上找到最矮的一株植物,把剩余的其他植物都修剪成与它等高,这样一个漂亮整齐的X型就出来了。

Xman的东西当然值钱了。每1单位高度的植物,就可以卖2美元,把减掉的植物都卖掉,就可以弥补罚单的损失了。你帮Xman计算一下一共可以卖多少钱。

【输入】

首先输入一个n(n<1000),表示花圃的边长。然后输入一个n*n的正整数二维数组,每个正整数值表示对应植物的高度h(h<1000)。

【输出】

输出卖出的美元总数

【样例输入】

3
1 1 3
3 2 2
1 2 2

【样例输出】

24

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    
    int i,j,a[100][100];
    
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    
    int sum=0;
    
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            if (i==j||j==(n-i-1))
                continue;
            else
                sum+=a[i][j];
        }
    }
    
    int min=10000;
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            if(i==j)
            {
                if(a[i][j]<min)
                    min=a[i][j];
            }
        }
    }
    
    for (i=0; i<n; i++)
    {
        sum+=a[i][i]-min;
        sum+=a[i][n-i-1]-min;
    }
    
    printf("%d\n",(sum-1)*2);
    
    return 0;
}

问题 K: 谁坐主宾

详见:http://liumengxiao.cn/articles/anwser_to_test2/
问题:G

问题 L: 是否相似

【题目描述】

现在有两个字符串,如果不区分大小写的话,他们的对应字母相同,并且他们的长度相同,我们就称他们为相似串。

例如abcd与AbcD,aaa与AAA都是相似串。但是abc与ab不是相似串,因为他们长度不同。也就是说相似串只允许大小写不同,其他必须相同。

现在请编程实现对相似串判断。

【输入】

第一行一个数T代表有T组数据

每组数据一行,有两个字符串,中间以空格分开,字符只有大小写字母,长度不超过100

【输出】

每组数据输出一行,如果相似输出yes否则输出no。

【样例输入】

3
qwe Qwe
ASDF ASd
aaa bbb

【样例输出】

yes
no
no

【参考代码】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    getchar();
    

    while (n--)
    {
        int flag=1;
        char s[150],c[150];
        scanf("%s",s);
        scanf("%s",c);
        
        if(strlen(s)!=strlen(c))
        {
            printf("no\n");
            continue;
        }

        for (int i=0; i<strlen(s); i++)
        {
            s[i]=toupper(s[i]);
            c[i]=toupper(c[i]);
        }
    
        for (int i=0; i<strlen(s); i++)
            if (s[i]!=c[i])
                flag=0;
        
        if(flag==0)
            printf("no\n");
        else
            printf("yes\n");
    }
    
    return 0;
}

问题 M: 学霸猫

【题目描述】

在我认识它的时候,它就已经叫学霸猫了,虽然我不知道它名字的由来,但在石大这种地方被冠以学霸之名。它经常会光顾正在上课的教室,并跟同学们一起耐心听讲,学校的教学楼、机房里到处都留下它的倩影,相信它将来会成为一个Doctor Cat。有心的同学记录下了它出现的课堂名称和出现时间。聪明的学霸猫是非常擅长学习的,即使在打盹的时候,也是在学习。它在某个课堂停留的时间越长,学习效果就越好。请你计算一下它哪门课学的最好吧(我不会告诉你它经常去听金老师的高等数学哟)。

【输入】

输入有多行。

每行包含三个数据,分别表示课堂名称(长度不超过30个字符),学霸猫的出现时间和离开时间,这两个时间都是指同一天。课堂名称保证不重复。

【输出】

输出学霸猫学习效果最好的一门课的名称和时长(具体格式见样例输出),占一行,两个数据间以空格分隔,末尾没有空格。

【样例输入】

programming 14:00 15:30
math 8:00 8:10

【样例输出】

programming 1:30

【参考代码】

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    char name[50];
    int a,b,c,d;
    int e;
}CO;

int cmp(const void *a, const void *b)
{
    return (*(CO *)b).e - (*(CO *)a).e;
}

int main(int argc, const char * argv[]) {
    CO team[20];
    int i=0;
    while(scanf("%s",team[i].name)!=EOF)
    {
        scanf("%d:%d",&team[i].a,&team[i].b);
        scanf("%d:%d",&team[i].c,&team[i].d);
        team[i].e=team[i].c*60+team[i].d-team[i].a*60-team[i].b;
        i++;
    }
    
    qsort(team,i+1,sizeof(CO),cmp);
    
    printf("%s %d:%d\n",team[0].name,team[0].e/60,team[0].e%60);
    return 0;
}

问题 N: 优良学风班

详见:http://liumengxiao.cn/articles/2015_final_exam_testa/
问题:B

问题 O: ACM罚时

【题目描述】

ACM国际大学生程序设计竞赛是由国际计算机学会主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。参赛队伍最多由三名参赛队员组成,竞赛中一般命题10-13题,试题描述为英文,比赛时间为5个小时,前4个小时可以看到实时排名,最后一小时封榜,无法看到排名。竞赛可以使用C、C++和Java。重点考察选手的算法和程序设计能力,选手可携带任何非电子类资料,包括书籍和打印出来的程序等。 返回结果Accepted表示答案正确,Wrong Anwser表示答案错误,Presentation Error表示程序没按规定的格式输出答案,Compile Error,表示程序编译错误。

另外,ACM比赛有个“罚时”(Penalty)的概念,首先做的题多的队伍排名更高,做出题目数量相同的队伍,由罚时来判断。比如C(题号)题在第30分钟做完,做错了2次,第三次得到了“Accepted”,那么这时的罚时是 30+20*2=70,20是ACM比赛约定俗成的系数,错一次罚20分钟,不过如果这题到比赛结束都没“Accepted”,那么这道题是不罚时的。相同题数的队伍,罚时少的排名更靠前。

【输入】

仅一行,比赛开始时间,题目提交Accepted时间,以及提交错误次数(>=0)

【输出】

题目成功通过时的罚时。

【样例输入】

9:00 9:30 2

【样例输出】

70

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b,c,d,e;
    scanf("%d:%d %d:%d",&a,&b,&c,&d);
    scanf("%d",&e);
    
    printf("%d\n",c*60+d-a*60-b+e*20);
    return 0;
}

问题 P: 计分规则

【题目描述】

某高校校园歌手大赛中,每位评委会给参赛选手打分。选手计分规则比较奇葩,每位选手的得分为一系列分数中最高分和最低分的平均分,请编程输出某选手的最终得分。

【输入】

输入数据仅1行,第一个数是n(2 < n < 100),表示评委的人数,然后是n个评委的打分。

【输出】

输出选手的得分,结果保留2位小数。

【样例输入】

3 99 98 97

【样例输出】

98.00

【提示】

成绩均为整数,取值范围为[0,100]

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    
    int a[100],max=0,min=100;
    while (n--)
    {
        int i=0;
        scanf("%d",&a[i]);

        if (a[i]>max)
            max=a[i];
        if (a[i]<min)
            min=a[i];
        
        i++;
    }
    printf("%.2lf\n",(double)(max+min)/2);
    
    return 0;
}

问题 Q: 拳皇

【题目描述】

拳皇2002是一款很经典的格斗游戏,主要流程就是两方各选择一名角色互相攻击直到一方血量为0,另一方即可获得胜利。在这里我们简化一下过程,由左方疯狂八神先攻击,然后再右方吉斯霍华德再攻击。然后循环,直到某一方血量为0游戏结束。

现在告诉你疯狂八神和吉斯霍华德两方角色各自的生命值和攻击伤害。你能告诉我是疯狂八神胜利,还是吉斯霍华德吗?

【输入】

仅1行,共四个整数。前面两个整数表示疯狂八神的生命值和攻击伤害,后面两个整数表示吉斯霍华德的生命值和攻击伤害。

【输出】

Left 或者 Right,Left 表示疯狂八神胜利,Right表示吉斯霍华德胜利。

【样例输入】

70 3 100 2

【样例输出】

Left

【提示】

不可能出现平局

【参考代码】

#include <stdio.h>
#include <math.h>

int main()
{
    double lh,la,rh,ra;
    scanf("%lf%lf%lf%lf",&lh,&la,&rh,&ra);
    long int lt=ceil(rh/la),rt=ceil(lh/ra);
    if(lt>rt)
        printf("Right");
    else
        printf("Left");
}

问题 R: 偷菜时间表

【题目描述】

偷菜,一般是指某些社交网站所开设的农场游戏中的一种活动,也代指这种游戏本身。即在好友的农场里,收获好友的虚拟劳动果实。也有现实中行为,偷取别人菜地中的菜。

随着“开心农场”等娱乐游戏风靡互联网,“偷菜”遂瞬间蹿红网络,席卷网民生活。于是,“你‘偷’了吗”便成为大家见面的招呼语。很快,数百万都市白领成为“偷菜”队伍中的主力军,每天在“偷”与防“偷”中乐此不疲,甚至定闹钟半夜起床“偷”菜。根据“农作物”生长规律而变化制定偷菜时间表。

【输入】

仅一行,分别为当前时间,作物成熟需要的时间, 格式均为Hour:Minute。

【输出】

24小时制的作物成熟时间,格式为hh:mm。小时和分钟输出时均占2位宽度,不足两位时用0补齐。

【样例输入】

13:15 0:30

【样例输出】

13:45

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b,c,d;
    scanf("%d:%d %d:%d",&a,&b,&c,&d);
    int hour,min;
    hour=a+c;
    min=b+d;
    
    while (min>=60)
    {
        hour++;
        min-=60;
    }
    
    while (hour>=24)
        hour-=24;
    
    printf("%02d:%02d\n",hour,min);
    return 0;
}

问题 S: 具有abcd=(ab+cd)^2性质的四位数

【题目描述】

求具有abcd=(ab+cd)^2性质的四位数。比如,3025这个数具有一种独特的性质:将它平分为二段,即30和25,使之相加后求平方,即(30+25)^2,恰好等于3025本身。根据输入求所有具有该性质的四位数abcd。

【输入】

输入数据为K1、K2,表示所求四位数的数据范围在K1和K2之间。(包含K1和K2,且K1和K2都在1000到9999之间,K2>K1)

【输出】

输出所有满足题目要求的四位数,每个输出数据后面换行(\n)。

【样例输入】

2000 3500

【样例输出】

2025
3025

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b;
    scanf("%d%d",&a,&b);
    
    for (int i=a; i<=b; i++)
    {
        int c,d;
        c=i/100;
        d=i%100;
        if ((c+d)*(c+d)==i)
            printf("%d\n",i);
    }
    return 0;
}

问题 T: 外币兑换

【题目描述】

小明刚从美国回来,发现手上还有一些未用完的美金,于是想去银行兑换成人民币。可是听说最近人民币将会升值,并从金融机构得到了接下来十二个月可能的美元对人民币汇率,现在,小明想要在接下来一年中把美金都兑换成人民币,请问最多能得到多少人民币?

【输入】

输入的第一行是一个实数N(1.00<=N<=100.00),表示小明现有的美金数量。

接下来一行,包含12个实数ai(5.00<=ai<=7.00),表示接下来十二个月的美元对人民币汇率。

【输出】

输出一个小数R,表示小明最多能获得的人民币数量,结果保留两位小数

【样例输入】

46.91
6.31 6.32 6.61 6.65 5.55 5.63 6.82 6.42 6.40 5.62 6.78 5.60

【样例输出】

319.93

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    double n,max=0;
    double a[12];
    
    scanf("%lf",&n);
    for (int i=0; i<12; i++)
    {
        scanf("%lf",&a[i]);
        max=a[i]>max?a[i]:max;
    }
    
    printf("%.2lf",max*n);
    
    return 0;
}

问题 U: 数字字符统计

【题目描述】

输入一行字符,以回车符作为输入结束的标志。统计其中数字字符的个数。

【输入】

多个字符,以回车符结束,回车符不作为有效字符。

【输出】

输出一个整数,表示数字字符的个数。

【样例输入】

12abrt12@2013

【样例输出】

8

【参考代码】

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc, const char * argv[]) {
    char s[100];
    int count=0;
    gets(s);
    
    for (int i=0; i<strlen(s); i++)
        if (isdigit(s[i]))
            count++;
    
    printf("%d\n",count);
    
    return 0;
}

问题 V: 二哥摘苹果

【题目描述】

二哥平日喜欢自己种一些东西,并以此为写程序和看电影之外的最大爱好。最近,二哥种的一棵苹果树到了采摘的时候,但是由于二哥身高的限制,有些苹果太高摘不到。于是二哥借来了一个凳子,踩在上面可以摘到更多的苹果。

二哥是一个懒于行动的人,他想在摘苹果之前知道自己能摘到多少苹果,如果实在太少(苹果树很茂盛,主要是由于身高原因),他宁可坐在树下等苹果自己掉下来砸到头上。

【输入】

输入共有两行。

第1行有3个整数,分别表示二哥的身高、凳子的高度和苹果的个数n。

第2行有n个整数,分别表示每个苹果的高度。

【输出】

输出一个整数m,表示二哥最多能摘到的苹果的个数为m。

【样例输入】

177 40 10
180 151 152 193 168 255 278 303 211 217

【样例输出】

7

【提示】

对于全部数据:高度为1000以下的正整数,苹果的个数1≤n≤1000。

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b,c,i=0,count=0;
    scanf("%d%d%d",&a,&b,&c);
    
    int ar[100];
    
    while (scanf("%d",&ar[i])!=EOF)
    {
        if(ar[i]<=a+b)
            count++;
        i++;
    }
    
    printf("%d\n",count);
    return 0;
}

问题 W: 勤劳的蚂蚁

【题目描述】

有两只勤劳的蚂蚁在准备食物,为了自我激励一下,它们打算开展比赛,看谁在一段时间内准备的食物多一些。

你能帮忙做个裁判吗,来统计一下哪只蚂蚁准备得更加多一些?

【输入】

输入有若干行,每行2个数字,第一个整数表示蚂蚁(1表示1号蚂蚁,2表示2号蚂蚁,不会出现其他数字)。

第二个整数表示该蚂蚁带回的食物数量,假设该数据都在合法范围内。当输入两个数字都为0(即0 0)时表示输入结束。

【输出】

输出拖回食物多的蚂蚁的编号和食物总数量。

如果相同,输出“equal”(输出不包含双引号)。输出后换行。

【样例输入】

1 2
2 9
1 7
2 6
1 1
2 0
1 2
2 11
0 0

【样例输出】

2 26

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b,suma=0,sumb=0;
    while(1)
    {
        scanf("%d%d",&a,&b);
        if(a==0&&b==0)
            break;
        if(a==1)
            suma+=b;
        else if (a==2)
            sumb+=b;
    }
    if(suma==sumb)
    {
        printf("equal\n");
        exit(0);
    }
    suma>sumb?printf("1 %d\n",suma):printf("2 %d\n",sumb);
}

问题 X: 发工资咯

【题目描述】

作为中国石油大学的老师,GL最盼望的日子就是每月的9号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?

这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。

【输入】

输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
n=0表示输入的结束,不做处理。

【输出】

对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。

【样例输入】

3 1 2 3
0

【样例输出】

4

【参考代码】

#include <stdio.h>

int main()
{
    int n, i, x, sum;
    
    while (scanf("%d", &n), n)
    {
        sum = 0;
        for (i=0; i<n; i++)
        {
            scanf("%d",&x);
            sum+=x/100;
            x%=100;
            sum+=x/50;
            x %= 50;
            sum+=x/10;
            x%=10;
            sum+=x/5;
            x%=5;
            sum+=x/2;
            x%=2;
            sum+=x;
        }
        printf("%d\n",sum);
    }
    
    return 0;
}

问题 Y: 密码破译I

详见:http://liumengxiao.cn/articles/2015_final_exam_testa/
问题:E

问题Z:最佳校友

详见:http://liumengxiao.cn/articles/anwser_to_test1/
问题:C

问题a : 破解简单密码

详见:http://liumengxiao.cn/articles/anwser_to_test2/
问题:D

问题b : 英文金曲大赛

【题目描述】

我们在“渊子数”的题目中已经了解了渊子是个什么样的人了,他在大一的时候参加过工商学院的“英语聚乐部”。告诉你个秘密,这个俱乐部是个好地方,不但活动精彩而且有MM。 这不,英语俱乐部举办了一个叫做“英文金曲大赛”的节目。这个节目有好多人参加,这不,成绩出来了,渊子当是很勇敢,自告奋勇接下了算出大家的总得分的任务。 当时有7个评委,每个评委都要给选手打分,现在要求去掉一个最高分和去掉一个最低分,再算出平均分。结果精确到小数点后两位。

【输入】

测试数据包括多个实例。 每组数据包括7个实数,代表评委们对该选手的评分。紧接着是选手的名字,名字的长度不超过30个字符。 输入直到文件结束。

【输出】

算出每位选手名字和最终得分,结果保留两位有效数字。

【样例输入】

10 10 10 10 10 10 9 xiaoyuanwang
0 0 0 0 0 0 0 beast

【样例输出】

xiaoyuanwang 10.00
beast 0.00

【参考代码】

#include <stdio.h>

void sort(float score[])
{
    int   i;
    int   j;
    float t;
    
    for(i=0; i<7; i++)
    {
        for(j=i; j<7; j++)
        {
            if(score[i] > score[j])
            {
                t= score[i];
                score[i]= score[j];
                score[j]= t;
            }
        }
    }
}


int main()
{
    int     i;
    char    name[30];
    float   num[7];
    float   sum;
    float   average;
    
    while( ( scanf("%f", &num[0]) )!=EOF)
    {
        sum=0.0;
        
        for(i=1; i<7; i++)
            scanf("%f", &num[i]);

        scanf("%s", name);

        sort(num);
        
        for(i=1; i<6; i++)
            sum+=num[i];
        
        average=sum/5;
        
        printf("%s %0.2f\n", name, average);
    }
}

问题c:密码破解

详见:本文
问题:A

问题d: 交通工具

【题目描述】

小明今年假期计划去海南旅游,我们知道冬季是海南的旅游旺季,小明为了能如愿以偿,需要提前做好出行攻略,到底是坐火车还是坐飞机呢?小明还在奋斗阶段,当然需要选择一种经济实惠的交通工具。小明从网上查询了飞机票价格,发现每个月的1-5号不打折,6-10号打6折,11-20号打5折,21-31号打3折,飞机税费(燃油附加费和机场建设费)不打折。众所周知,火车票从来都不打折,请你编程帮助小明选择更适合他的一种交通工具。

【输入】
输入有多组数据。每组包含四个数据,第一个是整数n,表示出行日期,其他三个是浮点数m1,m2,m3,其中,m1表示飞机票的原价,m2表示飞机税费,m3表示火车票的价格(单位:元)

【输出】

每行输出对应的省钱的交通工具和路费,当选择飞机时输出Airplane,选择火车时输出Train。如果两种交通工具价格相同时,选择火车(毕竟火车乘坐方便嘛)。路费四舍五入到元后再比较大小。

【样例输入】

8 1000 100 800

【样例输出】

Airplane 700

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    double plane,ex,train;
    while(scanf("%d %lf %lf %lf",&n,&plane,&ex,&train)!=EOF)
    {
        if(n>=6&&n<=10)
            plane*=0.6;
        else if(n>=11&&n<=20)
            plane*=0.5;
        else if(n>=21&&n<=31)
            plane*=0.3;

        if((int)(plane+ex+0.5)<(int)(train+0.5))
            printf("Airplane %d\n",(int)(plane+ex+0.5));
        else
            printf("Train %d\n",(int)(train+0.5));
    }
    
    return 0;
}

问题e:中外文化差异

详见:本文
问题:C

问题f : 门禁系统

【题目描述】

小明最近要负责图书馆的管理工作,需要记录下每天读者的到访情况,每位读者有一个编号,每条记录用读者的编号来表示,给出读者的来访纪录,请问每一条记录中的读者是第几次出现。

【输入】

输入有两行。第一行包含一个整数n(1<=n<=1000),表示小明的记录数。

第二行包含n个整数,依次表示小明的记录中每位读者的编号(<=n)。

【输出】

输出一行,包含n个整数,依次表示每条记录中读者编号是第几次出现,数据间用一个空格分开,每行末尾没有空格。

【样例输入】

5
1 2 1 1 3

【样例输出】

1 1 2 3 1

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int n,t;
    scanf("%d",&n);
    int a[10000]={0};
    
    while (n--)
    {
        scanf("%d",&t);
        a[t]++;
        if (n==0)
            printf("%d\n",a[t]);
        else
            printf("%d ",a[t]);
    }
    return 0;
}

问题g:密码破译

详见:本文
问题:A

问题h: 统计字母个数

【题目描述】

给定一段文章,请输出每个字母出现的次数

【输入】

只有一组输入数据,该数据大小<10KB。在文章中除最后一个字符外,只有小写字母、空格和换行符,没有另外的标点、数字和大写字母等。该文章以’#’结尾。

【输出】

输出格式为“C A”,C为’a’..’z’中的字母,A为出现次数,C和A之间空一格

【样例输入】

here is the input
this is the article#

【样例输出】

a 1
b 0
c 1
d 0
e 5
f 0
g 0
h 4
i 5
j 0
k 0
l 1
m 0
n 1
o 0
p 1
q 0
r 2
s 3
t 5
u 1
v 0
w 0
x 0
y 0
z 0

【参考代码】

#include <stdio.h>

int main()
{
    char c;
    int count[26] = {0};
    while (scanf("%c", &c) && c != '#')
    {
        switch (c)
        {
            case 'a':count[0]++; break;
            case 'b':count[1]++; break;
            case 'c':count[2]++; break;
            case 'd':count[3]++; break;
            case 'e':count[4]++; break;
            case 'f':count[5]++; break;
            case 'g':count[6]++; break;
            case 'h':count[7]++; break;
            case 'i':count[8]++; break;
            case 'j':count[9]++; break;
            case 'k':count[10]++; break;
            case 'l':count[11]++; break;
            case 'm':count[12]++; break;
            case 'n':count[13]++; break;
            case 'o':count[14]++; break;
            case 'p':count[15]++; break;
            case 'q':count[16]++; break;
            case 'r':count[17]++; break;
            case 's':count[18]++; break;
            case 't':count[19]++; break;
            case 'u':count[20]++; break;
            case 'v':count[21]++; break;
            case 'w':count[22]++; break;
            case 'x':count[23]++; break;
            case 'y':count[24]++; break;
            case 'z':count[25]++; break;
        }
    }
    for (int i = 0; i < 26; i++)
    {
        char a = 'a' + i;
        printf("%c %d\n", a, count[i]);
    }
    return 0;
}

问题i : 陶陶摘苹果

【题目描述】

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

【输入】

输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之 间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

【输出】

输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

【样例输入】

100 200 150 140 129 134 167 198 200 111
110

【样例输出】

5

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[10],count=0;
    
    for (int i=0; i<10; i++)
        scanf("%d",&a[i]);
    
    int n;
    scanf("%d",&n);
    
    for (int i=0; i<10; i++)
        if(a[i]<=n+30)
            count++;
    
    printf("%d\n",count);
    return 0;
}

问题j : 镜像文字

【题目描述】

天气太冷,学校却还不放寒假,外面冷得像冰库,真郁闷!Zero实在无聊,冻得哪儿都去不了,只能玩玩字符游戏,他想把ab变成aba,把123变成12321,你来帮帮他的忙吧。

【输入】

输入若干行。每行一个字符串,最长为200位。

【输出】

输出镜像文字,如输入124,则输出12421。具体看样例。

【样例输入】

111
123
zero

【样例输出】

11111
12321
zerorez

【参考代码】

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    char s[100];
    while(gets(s))
    {
        for (int i=0; i<strlen(s); i++)
            printf("%c",s[i]);
        for (int i=strlen(s)-2; i>=0; i--)
            printf("%c",s[i]);
        
        putchar('\n');
    }
    return 0;
}

问题k : 矩阵运算

【题目描述】

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

【输入】

输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

【输出】

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

【样例输入】

4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1

【样例输出】

35

【参考代码】

#include<stdio.h>

int main()
{
    int a[20][20];
    int i,j,sum,n;
    scanf("%d",&n);
    
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    }
    sum=0;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++) {
            if((i+j!=(n-1))&&(i!=(n-1))&&(j!=(n-1)))
                
                sum=sum+a[i][j];
        }
    
    printf("%d\n",sum);
    return 0;
    
}

问题l : 二进制中有多少个1

【题目描述】

进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

一个十进制的正整数转换成二进制后只有0和1组成。

【输入】

一个十进制的正整数

【输出】

一共有两行。第一行为该整数的二进制表示法,第二行为二进制表示法中1的个数。

【样例输入】

32

【样例输出】

100000
1

【参考代码】

#include<stdio.h>

int count(int i)
{
    int count = 0;
    while(i)
    {
        if(i&1)
            count ++;
        i=i>>1;
    }
    return count;
}
int main()
{
    int a,count=0;
    char s[20];
    int i=0,rem;
    scanf("%d",&a);
    do
    {
        rem=a%2;
        a=a/2;
        s[i]=rem;
        i++;
    }while(a!=0);

    while(i>0)
    {
        i--;
        printf("%d",s[i]);
        if (s[i]==1)
            count++;
    }
    printf("\n%d\n",count);
    
}

问题m:二维数组最大值及位置

【题目描述】

有一个3×4的矩阵,要求编程求出其中值最大的那个元素,以及其所在的行号和列号。(如果最大数有多个,则显示第1个出现的数据的信息)

【输入】

从键盘输入12个数字组成一个3*4的矩阵。

【输出】

输出矩阵中最大值,以及其所在的行号和列号。如有多个最大值,则显示第1个出现的。

【样例输入】

1 2 9 3
5 3 4 2
0 6 9 1

【样例输出】

9 0 2

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b,c,i=0,count=0;
    scanf("%d%d%d",&a,&b,&c);
    
    int ar[100];
    
    while (scanf("%d",&ar[i])!=EOF)
    {
        if(ar[i]<=a+b)
            count++;
        i++;
    }
    
    printf("%d\n",count);
    return 0;
}

问题n:回文

【题目描述】

百度百科中“把相同的词汇或句,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文”。例如:蜜蜂酿蜂蜜,风扇能扇风,奶牛产牛奶,清水池里池水清,静泉山上山泉,上海自来水来自海上,雾锁山头山锁雾 ,天连水尾水连天,院满春光春满院,门盈喜气喜盈门……

现给定一字符串,你的任务是判断它是否是回文串,并按照指定格式输出。

【输入】

输入为一行字符串(字符串中没有空白字符,字符串长度不超过80)。

【输出】

若是回文,则在字符之间插入‘*’,并输出;若不是,则原样输出。

【样例输入】

abcmcba

【样例输出】

a*b*c*m*c*b*a

【参考代码】

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    char s[100];
    gets(s);
    int flag=1;
    
    for (int i=0; i<strlen(s); i++)
        if (s[i]!=s[strlen(s)-1-i])
            flag=0;
            
    if(flag==1)
    {
        for (int i=0; i<strlen(s); i++)
        {
            if (i==strlen(s)-1)
                printf("%c\n",s[i]);
            else
                printf("%c*",s[i]);
        }
    }
    else
        puts(s);
   
    return 0;
}
分享