2009北京小学生程序设计友谊赛试题和答案

1、农夫与石头

FARMER.BAS / FARMER.C / FARMER.CPP / FARMER.PAS
【问题描述】
憨厚的老农夫昨天捡到了3 块小石头,他想再去捡一个小石头,让这4 个石头正好一共重
20 斤,请问他应该去捡一个多少斤的石头?
【输入文件】
文件名:FARMER.IN
文件中有三个整数 a,b,c,是这三个石头的重量(斤)。
【输出文件】
文件名:FARMER.OUT
文件中只有一个数,表示农夫应该去捡一个多少斤的石头。
【样例输入】3 5 7
【样例输出】5

答案:

#include <iostream>
#include <cassert>

using namespace std;

int main()
{
    int a, b, c, d;

    cin >> a >> b >> c;

    assert(a>=0 && b>=0 && c>=0);
    assert(a+b+c <= 20);

    d = 20 - (a+b+c);

    cout << d << endl;

    return 0;
}

2、老旧的机器

MACHINE.BAS / MACHINE.C / MACHINE.CPP / MACHINE.PAS
【问题描述】
伟大的工程师阿克蒙德买了一台机器,为了维持这台机器的正常运作他每年必须花费一定的费用来维修这台机器。但是随着这台机器的使用,机器会损坏更快以至于每年用来维修这台机器的费用都是上一年的 1.5 倍。已知第一年仅需要花费 1 元。现在阿克蒙德想知道, 如果他想用n 年,他总共需要花费多少钱来维修这台机器。
【输入文件】
文件名:MACHINE.IN
文件中只有一个整数n ,表示阿克蒙德想用n 年,已知1  n  40 。
【输出文件】
文件名:MACHINE.OUT
文件中只有一个整数,表示维修的总花费(结果四舍五入到个位)。

【样例输入】
3
【样例输出】
5

答案:

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    float sum = 1;
    float money = 1;    // 第n年的费用
    for(int i = 2; i <= n; i++)
    {
        money *= 1.5;
        sum += money;
    }

    cout << int(sum + 0.5) << endl;

    return 0;
}

3、帮助粉刷匠

(AREA.BAS/AREA.PAS/AREA.CPP)
小明建了一栋新房子,其中一面墙如图所示,现在已知屋顶上 N 个点到地面的高度,各点之前的水平距离为 1,他想把这面墙刷成蓝色,请帮他计算一下这面墙的面积 S 是多少。
在这里插入图片描述
例如:5 个点到地面的高度分别为(8、12、4、6、4),其面积 S 为:
S=(8+12)/2+(12+4)/2+(4+6)/2+(6+4)/2
【输入文件】: AREA.IN
第 1 行,一个整数n 代表点的个数
第 2 行,n 个整数分别代表屋顶到地面的高度,数和数间用空格隔开。

【输出文件】AREA.OUT
墙的面积

【样例输入】5
8 12 4 6 4
【样例输出】28

答案:

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int a[n];
    int area = 0;
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
        if(i >= 1)
        {
            area += (a[i - 1] + a[i]) / 2;
        }
    }

    cout << area << endl;;

    return 0;
}

4、缩短

SHORT.BAS / SHORT.C / SHORT.CPP / SHORT.PAS
【问题描述】
有一种字符串压缩方式简单易行。那就是,如果有连续很多个相同的字符,就把他们写作: 字符+出现次数的形式。
例如:aaagbbbbaac 压缩成 a3gb4a2c 现在你也来试试。
注意:字符单个出现的不作改变,只有连续出现多次才有改变。
【输入文件】
文件名:SHORT.IN
文件中只有一个字符串,由小写英文字母组成。(长度小于 240)
【输出文件】
文件名:SHORT.OUT

文件中有一个字符串,表示压缩后的字符串。
【样例输入】aaagbbbbaac
【样例输出】a3gb4a2c

答案:

#include <iostream>
#include<cstring>
using namespace std;
int main()
{
char a[1005];
int len,i,sum=0;
gets(a);
len=strlen(a);
for(i=0;i<=len-1;i++){
sum++;
if(a[i+1]!=a[i]){
if(sum==1){
printf("%c",a[i]);
sum=0;
}
else{
printf("%d%c",sum,a[i]);
sum=0;
}
}
}
}

5、矩形

MAXT.BAS / MAXT.C / MAXT.CPP / MAXT.PAS
【问题描述】
小明有很多个矩形,他们可能有不同的长和宽,现在, 小明想在一个大的矩形中放入两个较小的矩形,就像如下图这样:
在这里插入图片描述

现在给出小明拥有的所有矩形,请你选出 3 个,使得这 3 个矩形可以像上面这张图一样, 一个套两个,计算出有多少个组合方案,输出总方案数。
注意:
1.大矩形内的两个小矩形不能重叠,比如下面的情况是不可以的。
在这里插入图片描述

2.内矩阵的边应与外矩形平行,即内矩形不可以斜放,如下图是不可以的。
在这里插入图片描述
3.矩形的边可以重叠。
4.允许矩形旋转 90 度后放到矩形中。
【输入文件】
文件名:MAXT.IN
文件第一行为一个整数 N(1<=N<=50),表示矩阵的个数。
之后 N 行,每行两个整数,表示矩阵的长和宽。(长宽小等于 1000)
【输出文件】
文件名:MAXT.OUT
文件中只有一个整数,表示选出合法矩形的方案数。
(矩形按输入顺序编号 1 到N,如果两种方案使用的矩形编号组合相同,就视为相同方案, 如果有一个不相同的矩形编号,则视为不同方案)

【样例输入】4
30 30
8 9
5 10
10 5
【样例输出】3

【样例说明】3 种方案:
选取 1,2,3
选取 1,2,4
选取 1,3,4

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值