蓝桥杯夺奖班 | 如何如何搞定模拟题(上)

目录

成绩统计

题目描述

输入描述

输出描述

输入输出样例

运行限制

解题思路

AC_Code

Setprecision()

参数

返回值

示例

 使用 setprecision() 函数

蓝桥杯2020年第十一届省赛真题-成绩分析

题目描述

输入格式

输出格式

样例输入

样例输出

提示

解题思路

AC_Code

九进制转十进制

运行限制

 解题思路

AC_Code

        跑步锻炼

题目大意

解题思路

        AC_Code

        刷题统计

题目大意

输入格式

输出格式

样例输入

样例输出

评测用例规模与约定

解题思路

AC_Code


成绩统计

题目描述

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。

输入描述

输入的第一行包含一个整数 n (1 ≤ n ≤ 104),表示考试人数。

接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

输入输出样例

示例

输入

7
80
92
56
74
88
100
0

输出

71%
43%

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

解题思路

本题没有什么难点,唯一的地方是要注意最后的 四舍五入 ,用 +0.5 来实现四舍五入,如果是负数,就 -0.5 。

先循环,每一次循环输入一个数,紧接着判断数是否满足优秀或者几个的条件,由于要计算优秀率和及格率,我们需要在判断语句里面 有cnt++(用来记录一下及格和优秀的人数)。

AC_Code

使用 +- 0.5实现算法题里面的四舍五入

Setprecision()

setprecision()管理浮点操作的精度

参数

n-精度的新值

返回值

返回未指定类型的对象,使得若 str 是 std::basic_ostream<CharT, Traits> 类型的输出流名称或 std::basic_istream<CharT, Traits> 类型的输入流名称,则表达式 str << setprecision(n) 或 str >> setprecision(n) 表现为如同执行下列代码:

str.precision(n);

示例

#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
int main()
{
    const long double pi = std::acos(-1.L);
    std::cout << "default precision (6): " << pi << '\n'
              << "std::setprecision(10): " << std::setprecision(10) << pi << '\n'
              << "max precision:         "
              << std::setprecision(std::numeric_limits<long double>::digits10 + 1)
              << pi << '\n';
}

输出:

default precision (6): 3.14159
std::setprecision(10): 3.141592654
max precision:         3.141592653589793239

 使用 setprecision() 函数

成绩统计不需要加0.5了,只需要把后四句改为

cout << setprection(0) << fixed << (1.0 * cnt1 / n * 100) << "%\n" <<  (1.0 * cnt2 / n * 100) << "%\n";

这里使用 fixed 使保留几位小数变成了从小数点后面开始,如果不配合fixed使用的话,单单的

setprecision(),就是从第一个数字开始。

蓝桥杯2020年第十一届省赛真题-成绩分析

题目描述

小蓝给学生们组织了一场考试,卷面总分为100 分,每个学生的得分都是一个0 到100 的整数。请计算这次考试的最高分、最低分和平均分。

输入格式

输入的第一行包含一个整数n,表示考试人数。

接下来n 行,每行包含一个0 至100 的整数,表示一个学生的得分。

输出格式

输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

样例输入

7
80
92
56
74
88
99
10

样例输出

99
10
71.29

提示

对于50% 的评测用例, 1 ≤ n ≤ 100。
对于所有评测用例,1 ≤ n ≤10000。

解题思路

和上面的成绩统计一样,就是四舍五入使用的是round函数

AC_Code

#include<bits/stdc++.h>
using namespace std;

const int N = 10000;

int main()
{
    int n, a[N], sum, max, min;
    double avg;
    
    sum = 0;
    max = 0;
    min = 100;
    
    cin >> n;
    
    for(int i = 1;i <= n; i ++){
        cin >> a[i];    
        sum += a[i];
        if(a[i] > max)  max = a[i];
        if(a[i] < min)  min = a[i];
    }

    
    avg = 1.0 * sum / n;
    avg = round(avg * 100) / 100;
        
    cout << max << endl;
    cout << min << endl;
    printf("%.2f",avg);
    
    return 0;
}

九进制转十进制

九进制正整数 (2022)9(2022)9​ 转换成十进制等于多少?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

 解题思路

AC_Code

#include <iostream>
using namespace std;
int main()
{
  string s = "2022";
  int ans = 0;
  for(int i = 0; i < s.size();i ++)
    ans = ans * 9 + s[i] - '0';

  cout << ans << endl;

  return 0;
}

跑步锻炼

题目大意

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。

小蓝跑步已经坚持了很长时间,从 20002000 年 11 月 11 日周六(含)到 20202020 年 1010 月 11 日周四(含)。请问这段时间小蓝总共跑步多少千米?

解题思路

简单模拟题。

主要需要解决两个问题:

  • 是否是月初
  • 是否是周一

我们可以枚举从 2000​ 年 1 月 1日到 2020​ 年 10 月 1​ 日的所有日期:用 y、m、d 分表表示当前枚举的年、月、日,那么当 d=1 为月初,否则不为月初。问题一解决。

同时我们可以定义 week 表示当前日期所对应的星期,这样下一个日期所对应的星期就为 (week+1)​。那么当 week=1​ 时为周一,否则不为周一。问题二解决。

最后模拟一下即可(注意判断闰年),答案为 8879

AC_Code

#include<bits/stdc++.h>
using namespace std;
int D[13];
bool check(int y){
    if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) return true;
    return false;
}
signed main()
{
    D[1] = 31 , D[2] = 28 , D[3] = 31 , D[4] = 30 , D[5] = 31 , D[6] = 30;
    D[7] = 31 , D[8] = 31 , D[9] = 30 , D[10] = 31 , D[11] = 30 , D[12] = 31;
    int ans = 0 , week = 6;
    for(int y = 2000 ; y <= 2020 ; y ++){
        if(check(y)) D[2] = 29;
        else D[2] = 28;
        for(int m = 1 ; m <= (y == 2020 ? 10 : 12) ; m ++){
            if(y == 2020 && m == 10) D[m] = 1;
            for(int d = 1 ; d <= D[m] ; d ++){
                if(week == 1 || d == 1) ans += 2;
                else ans += 1;
                week = (week + 1) % 7;
            }
        }
    }
    cout << ans << '\n';
    return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int days[] = {
    0, 31, 28, 31, 30, 31, 30,
    31, 31, 30, 31, 30, 31
};

bool is_leap(int y){
    return y % 100 != 0 && y % 4 == 0 || y % 400 == 0;
}

int daysOfMonth(int y, int m){
    if (m == 2)
        return 28 + is_leap(y);
    return days[m];
}

int main()
{
    int y = 2000, m = 1, d = 1, w = 6;
    int res = 0;
    while (y != 2020 || m != 10 || d != 2){
        if (d == 1 || w == 1)
            res += 2;
        else
            res ++;
        w ++;
        if (w == 8)
            w = 1;
        d ++;
        if (d > daysOfMonth(y, m)){
            m ++, d = 1;
            if (m == 13)
                m = 1, y ++;
        }
    }
    cout << res << endl;
    return 0;
}

刷题统计

题目大意

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?

输入格式

输入一行包含三个整数 a,b 和 n.

输出格式

输出一个整数代表天数。

样例输入

10 20 99

样例输出

8

评测用例规模与约定

解题思路

一周的做题量为5a+2b,这是一个固定的值。需要实现大于等于 n 题,可以先计算至少需要多少周。

直接用n除以5a+2b得到需要花费的周数,剩下的题数为n,直接暴力计算需要几天可以完成.

AC_Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    ll a, b, n;
    cin >> a >> b >> n;
    //一周可完成num道题目
    ll num = 5 * a + 2 * b;
    ll ans = n / num * 7;
    n = n % num;
    
    //模拟最后一周的周一到周五
    for(int i = 1; i <= 5; i++)
    {
        if(n <= 0)break;
        ans++;
        n -= a;
    }
    //模拟最后一周的周六到周日
    for(int i = 1; i <= 2; i++)
    {
        if(n <= 0)break;
        ans++;
        n -= b;
    }
    cout<<ans<<endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

幸福西西弗斯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值