蓝桥杯第八讲--枚举与模拟【例题】(二)

简介: 蓝桥杯第八讲--枚举与模拟【例题】

特别数的和

来源: 第十届蓝桥杯省赛C++B组,第十届蓝桥杯省赛JAVAB组

题目要求

题目描述:

image.png

输入格式:

共一行,包含一个整数 n

输出格式:

共一行,包含一个整数,表示满足条件的数的和。

数据范围:

1≤n≤10000

输入样例:

40

输出样例:

574

思路分析

直接暴力做即可,这里有一个常用的模板,求一个数的各位的数字,不熟悉的读者建议背一下:

while (x)
{
   int t = x % 10;    //取个位
   x /= 10;           //删个位
}

代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int res = 0;
    for (int i = 1; i <= n; i ++ ) 
    {
        int x = i;
        while (x)
        {
            int t = x % 10;    //取个位
            x /= 10;           //删个位
            if (t == 2 || t == 0 || t == 1 || t == 9)
            {
                res += i;
                break;
            }
        }
    }
    cout << res << endl;
    return 0;
}

错误票据

来源: 第四届蓝桥杯省赛C++A/B组,第四届蓝桥杯省赛JAVAA/B组

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

image.png

数据范围:

1≤N≤100

输入样例:

2

5 6 8 11 9

10 12 9

输出样例:

7 9

思路分析

image.png

代码

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int cnt, n;
int a[N];
string l;
int main()
{
    cin >> cnt;
    getchar();    //读掉换行符
    while (cnt -- )
    {
        getline(cin, l);
        stringstream ssin(l);
        while (ssin >> a[n]) n ++;
    }
    sort(a, a + n);
    int res1, res2;
    for (int i = 1; i < n; i ++ )
        if (a[i] == a[i - 1]) res2 = a[i];
        else if (a[i] >= a[i - 1] + 2) res1 = a[i] - 1;
    cout << res1 << ' ' << res2 << endl;
    return 0;
}

回文日期

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

输出共一行,包含一个整数,表示在 d a t e 1 和 d a t e 2 之间,有多少个日期是回文的。

输入样例:

20110101

20111231

输出样例:

1

思路分析

日期类题目,首先判断是否为闰年:如果一年是闰年,要么满足可以被400 整除,要么满足不能被 100 整除但可以被 4 整除。本题中,我们如果去枚举日期的话是十分麻烦的,所以我们换一个思路,我们去枚举回文串,本题的回文串其实本质上就是一个回文八位数,我们可以枚举前四位,即枚举年,我们从 1000 开始枚举,直到枚举到 9999 ,利用前四位去构造后四位的回文,代码如下:

for (int i = 1000; i < 10000; i ++ )
{
   int date = i, x = i;
   for (int j = 0; j < 4; j ++ )
   {
       date = date * 10 + x % 10;
       x/= 10;
   }
}  

然后对于构造出来的回文八位数,我们去判断是否在两个给定日期之间,判断方法直接进行数值大小的比较即可,如果在两个给定日期之间,我们进而进行判断是否合法,我们取出 年月日:

int year = date / 10000;
int month = date / 100 % 100;
int day = date % 100;

image.png

代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool is_right(int date)
{
    int year = date / 10000;
    int month = date / 100 % 100;
    int day = date % 100;
    if (month > 12 || month < 1) return false;
    if (month != 2 && day > mon[month]) return false;
    int leap = (!(year % 400) || (year % 100) && !(year % 4));
    if (month == 2 && day > mon[month] + 1) return false;
    return true;
}
int main()
{
    int day1, day2;
    cin >> day1 >> day2;
    int res = 0;
    for (int i = 1000; i < 10000; i ++ )
    {
        int date = i, x = i;
        for (int j = 0; j < 4; j ++ )
        {
            date = date * 10 + x % 10;
            x/= 10;
        }
        if (date <= day2 && date >= day1)
            if (is_right(date)) res ++;
    }
    cout << res << endl;
    return 0;
}




目录
相关文章
|
存储 算法
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
75 0
蓝桥杯:递推 例题:数字三角型问题
蓝桥杯:递推 例题:数字三角型问题
55 0
|
移动开发 Shell
蓝桥杯:2020 国赛 例题:天干地支
蓝桥杯:2020 国赛 例题:天干地支
71 0
蓝桥杯:2019 国赛 例题:求值
蓝桥杯:2019 国赛 例题:求值
69 0
蓝桥杯:桶排序 与 例题:算式问题
蓝桥杯:桶排序 与 例题:算式问题
76 0
蓝桥杯:Map 和 例题:弗里的语言
蓝桥杯:Map 和 例题:弗里的语言
59 0
蓝桥杯:队列 Queue 和 例题: CLZ 的银行
蓝桥杯:队列 Queue 和 例题: CLZ 的银行
59 0
蓝桥杯:vector 与 例题:快递分拣
蓝桥杯:vector 与 例题:快递分拣
76 0
|
机器学习/深度学习
蓝桥杯:栈 和 例题 :小邋遢的衣橱
蓝桥杯:栈 和 例题 :小邋遢的衣橱
124 0
蓝桥杯:2021省赛 例题:直线
蓝桥杯:2021省赛 例题:直线
50 0