2019 【第十届蓝桥杯省赛】 C/C++ C组

目录

试题A:求和

试题B:矩形切割

试题C:年号字串

试题D:质数

试题E:最大降雨量

试题F:旋转

试题G:外卖店优先级

试题H:人物相关性分析(没有AC)

试题 I:等差数列

试题J:扫地机器人(不会)


试题A:求和

本题总分:5分

【问题描述】

      小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

      请问,在 1 到 2019 中,所有这样的数的和是多少?

① to_string()函数

其他类型数据转string,C++11新特性,很方便,比赛的时候大题不要用(蓝桥不能使用C++11特性)

填空要用的话看以这个回答:Dev 使用C++11特性

大题的话,int转string可以用sprintf(),stringstream代替:C/C++ int 和 string 相互转换

② find_first_of(string str,int index = 0)函数:

查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,如果没找到就返回string::npos

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m = 2019, sum = 0;
    string s;
    m++;
    while (m-- > 1)
    {
        s = to_string(m);
        if (s.find_first_of("2019") != string::npos)
        {
            sum += m;
        }
    }
    cout << sum << endl;
    //system("pause");
    return 0;
}
/*
答案:1905111
*/

试题B:矩形切割

本题总分:5 分
【问题描述】
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。
当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。

例如,对于一块两边分别为 5 和 3 的材料(记为 5×3),小明会依次切出 3×3、2×2、1×1、1×1 共 4 个正方形。

现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会 切出多少个正方形?

#include <bits/stdc++.h>
using namespace std;
int work(int a, int b)
{
    if (a == b)
        return 1;
    int k = min(a, b);
    int l = max(a, b);
    return work(k, l - k) + 1;
}
int main()
{
    int a = 2019, b = 324;
    cout << work(a, b) << endl;
    //system("pause");
    return 0;
}
/*
答案:21
*/

试题C:年号字串

本题总分:5 分

【问题描述】

小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对 应 28,AZ 对应 52,LQ 对应 329。

请问 2019 对应的字符串是什么?

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

int main()
{
    int m = 2019;
    while( m!=0)
    {
        int t = m%26;
        m=m/26;
        cout << char(t+64);
    }
    //system("pause");
    return 0;
}
/*
输出:QYB
答案:BYQ
*/

试题D:质数

本题总分:10 分

【问题描述】

我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……请你计算 第 2019 个质数是多少?

#include <bits/stdc++.h>
using namespace std;
int prim(int a)
{
    for (int i = 2; i <= sqrt(a); i++)
    {
        if (a % i == 0)
            return false;
    }
    return true;
}
int main()
{
    int cnt = 0;
    for (int i = 1; i; i++)
    {
        if (prim(i) == true)
            cnt++;
        if (cnt == 2020)
        {
            cout << i << endl;
            break;
        }    
    }
    //system("pause");
    return 0;
}
/*
答案:17569
*/

试题E:最大降雨量

本题总分:10 分

【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。
这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?

上图借鉴于博客:https://blog.csdn.net/u013377068/article/details/88776898 博主:糖宋元明清 

例如这样,就是一种可能的答案: 

答案:34

试题F:旋转

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分

【问题描述】

图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。
我们用一个 n × m 的二维数组来表示一个图片,例如下面给出一个 3 × 4 的图片的例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转 90 度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片。

【输入格式】
输入的第一行包含两个整数 n 和 m,分别表示行数和列数。
接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。

【输出格式】
输出 m 行 n 列,表示旋转后的图片。

【样例输入】

3 4
1 3 5 7
9 8 7 6
3 5 9 7

【样例输出】

3 9 1
5 8 3
9 7 5
7 6 7

【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n, m ≤ 10。
对于 60% 的评测用例,1 ≤ n, m ≤ 30。
对于所有评测用例,1 ≤ n, m ≤ 100。

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

int main()
{
    int n, m;
    cin >> n >> m;
    int map[200][200];
    for (int i = 0; i < n; i++)
        for (int j = 0, t; j < m; j++)
            cin >> map[i][j];

    for (int i = 0; i < m; i++)
        for (int j = n - 1; j >= 0; j--)
            cout << map[j][i] << (j==0?'\n':' ');

    //system("pause");
    return 0;
}

试题G:外卖店优先级

【题目描述】

“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。

每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。

如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。

给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。

【输入】

第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到

一个订单。

【输出】

输出一个整数代表答案。

【样例输入】

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

【样例输出】

1

【样例解释】

6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。

【评测用例规模与约定】

对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。 对于所有评测用例,1 ≤ N, M, T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。

 对每个店进行分析。

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

int main()
{
    int n, m, t, ts, id, cnt = 0;
    int level;
    bool is_priority = false;
    vector<int> v[100005];

    cin >> n >> m >> t;
    for (int i = 1; i <= m; i++)
    {
        cin >> ts >> id;
        v[id].push_back(ts);
    }
    for (int i = 1; i <= n; i++)
    {
        if (v[i].size() == 0)
            continue;
        sort(v[i].begin(), v[i].end());
        is_priority = false;
        level = 2;
        for (int j = 1; j < v[i].size(); j++)
        {
            if (v[i][j] - v[i][j - 1] <= 1)
                level += 2;
            else
            {
                level -= (v[i][j] - v[i][j - 1] - 1);
                if (level < 0)
                    level = 0;

                if (level <= 3)
                    is_priority = false;

                level += 2;
            }
            if (level > 5)
            {
                is_priority = true;
            }
        }
        int k = v[i][v[i].size() - 1];
        level -= (t - k);

        if (level <= 3)
            is_priority = false;
        if (is_priority == true)
            cnt++;
    }
    cout << cnt << endl;
    //system("pause");
    return 0;
}
/*
1 4 7
1 1
2 1
3 1
7 1
*/

试题H:人物相关性分析(没有AC)

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

【问题描述】
       小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
       This is a story about Alice and Bob.Alice wants to send aprivate message to Bob. 假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。 注意: 1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。 2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
       第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超 过 1000000。
【输出格式】
       输出一个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】

20
This is a story about Alice and Bob.Alice wants to send aprivate message to Bob.

【样例输出】

2

【评测用例规模与约定】
       对于所有评测用例,1\leq K \leq 1000000

https://www.dotcpp.com/oj/problem2309.html,C语言网上1/243的正确率。。。。

目前全网没找到分享正确答案的博主,我自己也没AC,oj跑36分,,一百万长的串!!怎样才能不超时呀。。。求指点(*╹▽╹*)

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int m, cnt = 0;
    string str;
    pair<int, int> p[500005];
    int pter = 0;
    cin >> m;
    cin.get();
    getline(cin, str);

    int pos1 = 0;
    while (pos1 != string::npos)
    {
        pos1 = str.find("Alice", pos1);
        if (string::npos != pos1 && (!isalnum(str[pos1 - 1]) && !isalnum(str[pos1 + 5])))
        {
            p[pter].first = pos1;
            p[pter++].second = 1; 
            pos1 += 5;
        }
    }
    int pos2 = 0;
    while (pos2 != string::npos)
    {
        pos2 = str.find("Bob", pos2);
        if (string::npos != pos2 && (!isalnum(str[pos2 - 1]) && !isalnum(str[pos2 + 3])))
        {
            p[pter].first = pos2;
            p[pter++].second = 2; 
            pos2 += 3;
        }
    }
    for (int it = 0; it < pter; it++)
    {
        int f = p[it].second;
        int t = f == 1 ? 3 : 5;
        for (int i = it; i != pter; i++)
        {
            if(p[i].first-p[it].first > m)
                break;
            if(p[i].second != f)
                cnt++;    
        }
    }
 
    cout << cnt << endl;
    //system("pause");
    return 0;
}
/*
20
This is a story about Alice and Bob. Alice wants to send a private message to Bob.

20
20
Alice Alice Bob story about Alice and Bob. Alice wants to send a private message to Bob.

20
Alice Bob Alice Bob Alice Bob 

20
Alice Bob Bob Bob Alice Bob Alice Bob 

20
Bob Alice Alice Alice
*/

试题 I:等差数列

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

【题目描述】

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。

现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有 几项?

【输入】

输入的第一行包含一个整数 N。 第二行包含N个整数A1,A2,···,AN。(注意A1 ∼AN并不一定是按等差数

列中的顺序给出)

【输出】

输出一个整数表示答案

【样例输入】

5
2 6 4 10 20

【样例输出】

10

【样例说明】

包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。

【评测用例规模与约定】

对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ Ai ≤ 10^9

从小到大排好序,公差d = min(d[i]-d[i-1]),先求出d

然后有三种情况:

一、2 4 6 10 20  ,显然d = 2, 项数 =(20-2)/2+1 = 10;

二、1 3 8,算出来d=2,但这是错的,(8-1)/ 2= 3.5 ,两项之差不能被d整除,不符合等差数列性质,所以d=1;

三、2 2 2 2 2,d=0,直接输出n。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <cmath>
#include <iomanip>
#include <vector>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int m;
    vector<int> v;
    cin >> m;
    for (int i = 0, t; i < m; i++)
    {
        cin >> t;
        v.push_back(t);
    }
    sort(v.begin(), v.end());

    int d = INT32_MAX;
    for (int i = 1; i < v.size(); i++)
    {
        int t = fabs(v[i] - v[i - 1]);
        d = min(d, t);
    }
    int k = v[m - 1] - v[0];
    cout << (k == 0 ? m : (k % d == 0 ? k / d + 1 : k + 1)) << endl;

    //system("pause");
    return 0;
}

试题J:扫地机器人(不会)

完全没有思路

  • 17
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值