2018 蓝桥杯省赛 B 组模拟赛(一)

2018 蓝桥杯省赛 B 组模拟赛(一)

A、今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。

花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”

请你计算:蒜头君和花椰妹年龄一共有多少种可能情况?

提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内。

题解: 暴力枚举

answer: 1

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int ans=0;
    for(int i=10;i<100;i++)
    {
        int x=2*(i%10+i/10);
        if(10<=x&&x<100&&i==3*(x%10+x/10))
            ans++;
    }
    printf("%d
",ans);
    return 0;
}
View Code

B、蒜头君今天回到了老家的大宅院,老家的灯还是那中拉线的灯(拉一次为亮,再拉一次就灭),蒜头君觉得无聊。把 10001000 盏灯 3的倍数拉了一次,5的倍数拉了一次,7的倍数拉了一次(灯得的编号从 1-100011000,灯的初始状态都是亮的)。这个时候蒜头君在想还剩下几盏灯还在亮着?

提示:请不要输出多余的符号。

题解:还是暴力,可以初始化一个数组全为0(表示灯全亮),然后跑三个for循环,第一次循环,若是3的倍数,该元素的值就去反,同理,第二次,5的倍数,第三次7的倍数

answer: 571

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N=1e3+7;
int vis[N]={0};
int main()
{
    int ans=0;
    for(int i=1;i<=1000;i++)
        if(!(i%3))
            vis[i]=!vis[i];
    for(int i=1;i<=1000;i++)
        if(!(i%5))
            vis[i]=!vis[i];
    for(int i=1;i<=1000;i++)
        if(!(i%7))
            vis[i]=!vis[i];
    for(int i=1;i<=1000;i++)
        if(!vis[i])
            ans++;
    printf("%d
",ans);
    return 0;
}
View Code

C、最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增。比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 3131331313,就是不是U型数字。

现在蒜头君问你,[1,100000][1,100000] 有多少U型数字?

提示:请不要输出多余的符号。

题解:可以先找到最小值的位置,若最小值的位置在两头,不是U行数字,让后判断两断是否严格递减和递增

answer:   8193

代码如下:

def path(x,index):
    if index==0 or index==len(x)-1:
        return False
    else:
        for i in range(index):
            if x[i]<=x[i+1]:
                return False
        for i in range(index,len(x)-1):
            if x[i]>=x[i+1]:
                return False
        return True
if __name__ == '__main__':
    ans=0
    for i in range(100,100001):
        x=str(i)
        minn=x[0]
        index=0
        for j in range(len(x)):
            if minn>=x[j]:
                minn=x[j]
                index=j
        if path(x,index):
            ans=ans+1
    print(ans)
View Code

D、LIS是最长上升子序列。什么是最长上升子序列? 就是给你一个序列,请你在其中求出一段最长严格上升的部分,它不一定要连续。

就像这样:22, 33, 44, 77 和 22, 33, 44, 66 就是序列 253341766 的两个上升子序列,最长的长度是 44。

题解:典型的dp题,f[i]表示前i个数字的上升子序列的最长长度,状态方程为: f[i]=max(f[i],f[j]+1);

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int f[10000], b[10000];
int max(int a, int b) {
    return a > b ? a : b;
}
int lis(int n) {
    memset(f, 0, sizeof f);
    int res = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            if (b[j] < b[i]) {
                f[i]=max(f[i],f[j]+1);
            }
        }
        res = max(res, f[i]);
    }
    return res+1;
}
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", b + i);
    }
    printf("%d
", lis(n));
    return 0;
}
View Code

E、相信大家都知道什么是全排列,但是今天的全排列比你想象中的难一点。我们要找的是全排列中,排列结果互不相同的个数。比如:aab 的全排列就只有三种,那就是aab,baa,aba

代码框中的代码是一种实现,请分析并填写缺失的代码。

该全排列用的是dfs , 代码片段要填的主要功能是:去重,因此当str[i]==str[j]&&vis[j]成立 ,跳出

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1000

char str[N], buf[N];
int vis[N], total, len;

void arrange(int num) {
    int i, j;
    if (num == len) {
        printf("%s
", buf);
        total++;
        return;
    }
    for (i = 0; i < len; ++i) {
        if (!vis[i]) {
            for (j = i + 1; j < len; ++j) {
                if (str[i]==str[j]&&vis[j]) {
                    break;
                }
            }
            if (j == len) {
                vis[i] = 1;
                buf[num] = str[i];
                arrange(num + 1);
                vis[i] = 0;
            }
        }
    }
}
int main() {
    while (~scanf("%s", str)) {
        len = strlen(str);
        int i, j;
        for (i = 0; i < len; ++i) {
            for (j = i + 1; j < len; ++j) {
                if (str[i] > str[j]) {
                    char tmp = str[i];
                    str[i] = str[j];
                    str[j] = tmp;
                }
            }
        }
        total = 0;
        buf[len] = '

相关推荐