2023环翠区编程挑战赛小学组题解

T1. 乘车费用

题目描述

星期天上午小红乘出租车去本市的奶奶家。出租车计价方案为: 3 3 3公里以内(包括 3 3 3公里)起步价是 13 13 13元,超过 3 3 3公里之后按 2.3 2.3 2.3元/公里计价,整个乘车途中另加 1 1 1元钱的燃油费。

已知:小红到奶奶家的路程为 N N N 公里,请你计算一下小红到奶奶家的出租车费用是多少元?

输入格式

输入一个整数 N N N,表示路程

输出格式

输出一个整数表示乘车 N N N公里后,出租车的费用(要求四舍五入保留整数),单位:元。

输入样例1

2

输出样例1

14

输入样例2

15

输出样例2

42

数据范围

对于 20 % 20\% 20%的数据 1 ≤ N ≤ 3 1 ≤ N ≤ 3 1N3
对于 100 % 100\% 100%的数据 1 ≤ N ≤ 30 1 ≤ N ≤ 30 1N30 ,其中存在 30 % 30\% 30%的数据需要考虑四舍五入。

代码实现

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int ans = 14; //3公里以内13,燃油费1
    if(n > 3) {
        int x = (n - 3) * 2.3 + 0.5; //+0.5处理四舍五入
        ans += x;
    }
    cout << ans;
    return 0;
}

T2. 竞争对手

题目描述

邻近高考,学校组织了一系列的考试,对每场考试的排名进行前后对比,以此来调动学生学习的积极性。

在经过了 2 场考试后,为了更好的提高学生的积极性,学校希望能够找出每位学生的竞争对手,使他们能够在竞争中一起成长。

竞争对手的定义:

2 2 2场考试的过程中只要2位学生的名次存在超过或被超过的情况,就认为他们是竞争对手。

例如第一场考试排名为 1   2   i   3   j   4   5 1\ 2\ i\ 3\ j\ 4\ 5 1 2 i 3 j 4 5 i i i 排在 j 的前面,第二场考试排名为 1   2   j   3   i   4   5 1\ 2\ j\ 3\ i\ 4\ 5 1 2 j 3 i 4 5 j j j 排在 i i i的前面那么我们认为 i i i j j j 为竞争对手。

请帮学校找出一共有几对竞争对手。

输入格式:

第一行,输入整数 n n n ,表示考生人数;
接下来 2 行,每行 n n n 个数,第 i i i 行的第 j j j 个数表示为第 i i i 场考试的第 j j j 名的学生排名(编号 1 − n 1-n 1n 之间);

输出格式:

输出一个整数,表示有几对竞争对手。

输入样例1:

5
3 4 5 2 1
2 3 4 1 5

输出样例1:

4

样例1解析
学生 1 1 1,第一场考试 2 , 3 , 4 , 5 2,3,4,5 2345排在 1 1 1的前面,第二场考试 5 5 5排在 1 1 1的后面,所以 ( 1 , 5 ) (1,5) 15是竞争对手;
学生 2 2 2,第一场考试 3 , 4 , 5 3,4,5 345排在2的前面,第二场考试 1 , 3 , 4 , 5 1,3,4,5 1345排在 2 2 2的后面,所以 ( 2 , 3 ),( 2 , 4 ),( 2 , 5 ) (2,3),(2,4),(2,5) 23),(24),(25是竞争对手;
学生 3 3 3,第一场考试前面没人,第二场考试 2 2 2排在 3 3 3的前面,所以 ( 3 , 2 ) (3,2) 32是竞争对手;
学生 4 4 4,第一场考试 3 3 3排在 4 4 4的前面,第二场考试 2 , 3 2,3 23排在 4 4 4的前面,所以 ( 4 , 2 ) (4,2) 42是竞争对手;
学生 5 5 5,第一场考试 3 , 4 3,4 34排在前面,第二场考试 1 , 2 , 3 , 4 1,2,3,4 1234排在 5 5 5的前面,所以 ( 5 , 1 ),( 5 , 2 ) (5,1),(5,2) 51),(52是竞争对手;
重复的不算,像 ( 3 , 2 ) (3,2) 32 ( 2 , 3 ) (2,3) 23算一个,一共有 ( 1 + 3 + 1 + 1 + 2 ) ÷ 2 = 4 (1+3+1+1+2)\div 2 = 4 1+3+1+1+2÷2=4 对 。

数据范围:

对于 30 % 30\% 30%的数据, 1 ≤ n ≤ 10 1 ≤ n ≤ 10 1n10
对于 70 % 70\% 70%的数据, 1 ≤ n ≤ 200 1 ≤ n ≤ 200 1n200
对于 100 % 100\% 100%的数据, 1 ≤ n ≤ 5000 1 ≤ n ≤ 5000 1n5000

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int a[N], b[N];
int main()
{
    int n, x;
    cin >> n;
    for(int i = 1; i <= n; i ++) {
        cin >> x;
        a[x] = i;
    }
    
    for(int j = 1; j <= n; j ++) {
        cin >> x;
        b[x] = j;
    }
    int ans = 0;
    //枚举第i名同学和第j名同学
    for(int i = 1; i <= n; i ++) {
        for(int j = i + 1; j <= n; j ++)
        {
            //如果第一次考试i在j后,而第二场考试i在j前
            //或者第一次考试i在j前,而第二次考试i在j后
            if(a[i] > a[j] && b[i] < b[j] || a[i] < a[j] && b[i] > b[j]) 
            {
                //cout << "(" << i << "," << j << ")" << endl; 
                ans ++;
            }
        }
    }
    
    cout << ans;
    return 0;
}

T3. 魔法数制

题目描述

魔法世界的数学发展的和人类世界不一样,在创造数制的时候,魔法先知用无穷大符号 ∞ ∞ 代替了 0 0 0,这也给后人们带来了许多烦恼。

先知制定的魔法世界数制规则如下:

  • 每个位可用 ∞ ∞ 1..9 1..9 1..9,其大小比较规则为 1 < 2 < . . . < 9 < ∞ 1<2<...<9<∞ 1<2<...<9<
  • 每个数由 n n n个位组成,默认前面都是 ∞ ∞ ,比如 n = 5 n=5 n=5时, 123 实际是 ∞ ∞ 123 123实际是∞∞123 123实际是∞∞123
  • 在这个数制里,最小数是 111...11 111...11 111...11( n n n个),编号为 1 1 1;其次是 111...12 111...12 111...12( n n n个),编号为 2 2 2;最大数是 ∞ . . . ∞ ∞...∞ ∞...∞( n n n个),编号为 1 0 n 10^n 10n
  • 数制没有符号位,也即所有的数都是正的

现在你理解魔法数制了吗? 对于给定的 n n n和长度 < = n <=n <=n的一个数,求出该数在 n n n位魔法数制里的编号吧。

提示: ∞ ∞ utf8字符,占用 3 3 3个字节

输入格式:

第一行一个数字 n n n,表示数制的长度
第二行一个长度 < = n <=n <=n位的数 x x x,由 1..9 、 ∞ 1..9、∞ 1..9组成

输出格式

一个数字,表示输入魔法数的编号(编号是十进制表示,不是魔法数制)

输入样例1:

2
15

输出样例1:

5

样例1说明:最小是 11 11 11,然后 12 、 13 、 14 、 15 12、13、14、15 12131415,编号为 5 5 5

输入样例2:

2
5

输出样例2:

95

样例2说明: 5 = ∞ 5 5=∞5 5=∞5,前面是 11..1 ∞ 11..1∞ 11..1∞ 21..2 ∞ 21..2∞ 21..2∞,…, 91..9 ∞ 91..9∞ 91..9∞ ∞ 1 、 ∞ 2 、 ∞ 3 、 ∞ 4 ∞1、∞2、∞3、∞4 ∞1∞2∞3∞4,编号为 95 95 95.

数据范围:

样例1: n = 1 n=1 n=1
样例2: n = 2 n=2 n=2
样例3-4: n < = 5 n<=5 n<=5,输入数长度 = n =n =n x x x里只有 1..9 1..9 1..9
样例5-7: n < = 10 n<=10 n<=10 x x x里只有 1..9 1..9 1..9
样例8-10: n < = 18 n<=18 n<=18 x x x里有 1..9 1..9 1..9 ∞ ∞

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 50;
char a[N];
int b[N];
int main()
{
    int n, s, m = 0;
    cin >> n;
    cin >> a;
    s = strlen(a);
    //将字符串整理为数字形式,每个数字字符-1,∞替换为9
    for(int i = s - 1; i >= 0; i --)
    {
        if(a[i] >= '0' && a[i] <= '9') b[m ++] = a[i] - '1';
        else 
        {
            b[m ++] = 9;
            i -= 2;
        }
    }
    //不足n位就进行补位
    while(m < n) b[m ++] = 9;
    //整理为10进制数
    long long ans = 0;
    for(int i = n - 1; i >= 0; i --) ans = ans * 10 + b[i];
    //计算编号
    cout << ans + 1 << endl;
}

T4. 图形打印

题目描述

小明今天在课上学习了矩阵,老师带着小明打印了许多花式图形,为了巩固知识老师布置了一道图形打印作业。

题目要求:输入这个整数 n n n,输出对应的图形。

图形如下:
请添加图片描述
填充规则:

  • 以中间十字为基准,例如上图就是十字大小为 n = 4 n=4 n=4的图形;
  • 十字的每个顶点都会延长两个*作为结尾,所以最后图形大小一定为 ( 2 n + 1 + 4 ) ∗ ( 2 n + 1 + 4 ) (2n+1+4) * (2n+1+4) (2n+1+4)(2n+1+4)
  • 十字的每个结尾的斜线连接的范围内,除十字都以*填充;
  • 其余位置以中间十字及斜线范围内的数填充完为基准进行*和空格交替填充。

输入格式:

输入一个整数 n n n ,表示十字大小;

输出格式:

输出对应图形;

输入样例1:

1

输出样例1:

 * * * 
* *** *
 ** ** 
**   **
 ** ** 
* *** *
 * * * 

输入样例2:

4

输出样例2:

* * * * * * *
 * * *** * * 
* * ** ** * *
 * *** *** * 
* **** **** *
 ***** ***** 
**         **
 ***** ***** 
* **** **** *
 * *** *** * 
* * ** ** * *
 * * *** * * 
* * * * * * *

数据范围:

样例1: n = 2 n=2 n=2
样例2: n = 3 n=3 n=3
样例1,3,5,7,9: n n n为偶数;
样例1-5: n ≤ 20 n ≤20 n20
样例6-10: 20 < n ≤ 100 20 < n ≤ 100 20n100

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 500;
char g[N][N];
int main()
{
    int n, m;
    cin >> n;
    m = 2 * n + 5;
    //交替填充空格和*
    int flag = n % 2;
    for(int i = 1; i <= m; i ++)
        for(int j = 1; j <= m; j ++)
        {
            if(flag) g[i][j] = ' ', flag = !flag;
            else g[i][j] = '*', flag = !flag;
        }
    //在中间部分填充*
    int mid = m / 2 + 1, c = 0;
    for(int i = 1; i <= m; i ++)
    {
        for(int j = mid - c; j <= mid + c; j ++)
            g[i][j] = '*';
            
        if(i < mid) c ++; //上半部分每次增加两个*
            else c --; //下半部分每次减少两个*
    }
    //将十字部分填充空格
    for(int i = mid - n; i <= mid + n; i ++) g[i][mid] = ' ';
    for(int i = mid - n; i <= mid + n; i ++) g[mid][i] = ' ';
    //输出图形
    for(int i = 1; i <= m; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            cout << g[i][j];
        }
        puts("");
    }
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少儿编程乔老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值