首页 > 技术文章 > 蓝桥杯模拟赛

rongrongrong 2021-04-12 18:13 原文

一 :   题目描述 

今年是2021年,请问数字1到数字2021中,出现了多少个数字6。
签到题:
#include <stdio.h>

int main() {
    int i, j, ans = 0;
    for(i = 1; i <= 2021; i++){
        j = i;
        while(j){
            if(j % 10 == 6)ans++;
            j /= 10;
        }
    }
    printf("%d\n",ans);

    return 0;
}

二   题目描述 :

小明同学正在学习一种新的语言。在该语言中,如果出现了一次wa或者一次aw,则代表出现了一个警告。如果出现了连续的wa或者连续的aw,则代表出现了一个错误。小明由于学习比较粗心,所以他想要知道自己刚刚写完的作业中一共出现了多少处警告和错误。下面是小明刚刚写完的作业,请你帮助小明找到他一共出现了多少次警告和多少次错误。

abcwaawawawa中出现了一次警告(wa)和一次错误(awawaw)
abcdefg中没有出现一次警告和错误
waawwaawwawa中出现了四次警告(两次wa和两次aw)和一次错误(wawa)
awawwawa中只出现了两次错误(awaw和wawa)

备注:

小明的作业如下:
iawaswapwauawhawdwafwanbiopwanivgbikvblvbwawawawvolyuvgbololvolgbyolgyowagbolgawgboplwawaolgyolwaogblwaygbowawagwabwayawopwawagyowabwaowapjwapcfrtuywawacvujwawawaufttyfuftywawawatifgugbgbyguwawawawayugbigwwwytigwygwgbwyoawawgoghwaogwborgrewabouyhwabyuhowabhnwawauygbawyawuwaoawfcawaaaahwaywauwagwawefwaafmbawklawjiawihnwanhawawawawijwajiofjeriofgjrefjhwaewarwaowagwahwauwaiwarwaiwaqwarwahwaqwawwaowapfweofbwewafwahwaiwaewawwawawawawafwawawawaeiufwepfhnewfwahwajwatwafowawajtokshwawafwaiwahwafwahmgoewawawawafkfjkewnwawafiewhfwawawafjkernhawkrenwawawawafujnrheiowanwakawawawawwanoifewajrwaoawawfweojnwawawawawawawafjkwenawawferkwmpwawawawaforeijawawferhfiueorghwuwafguwegfwaghrwiufgwahweofgowaidwiweaiwwawieyiwe
 

这题,遍历一下子串就OK了;

  找到a并且下一个是w,或者找到w下一个是a的情况,进入while循环,flag + 1,此时flag = 1;

  如果找到的aw并且下两个还是字符还是aw的话flag + 1;即flag > 1的话,算上前面的aw说明这是个错误,若flag = 1的话说明这是个警告;

#include <stdio.h>
#include <string.h>
#include <math.h>
char s[10000005];
int main() {
    int i, l, flag, ans = 0, cnt = 0;//ans 为警告,cnt 为错误; 
    gets(s);
    l = strlen(s);
    for(i = 0; i < l; i++) {
        flag = 0;
        while(s[i] == 'a' && s[i + 1] == 'w') {
            i += 2;
            flag++;
        }
        if(flag == 1)ans++;
        else if(flag > 1)cnt++;
        flag = 0;
        while(s[i] == 'w' && s[i + 1] == 'a') {
            i += 2;
            flag++;
        }
        if(flag == 1)ans++;
        else if(flag > 1)cnt++;
    }
    printf("%d\n%d\n",ans,cnt);
 
    return 0;
}

 



三   题目描述:

  小明最近痴迷于斐波那契数列(1,1,2,3,5……),但是最近他又有了新的奇思妙想,就是对于斐波那契数列的相邻的两个数相乘取倒数然后将每一项进行相加,由于小明只喜欢思考不喜欢动手,所以现在他想让      你帮他算下这样一个新的数列的前13项的和为多少?(结果用分数表示,且保留最简分数)
 

思路:

直接加,从头加到尾,中间过程不断进行约分(分子,分母都除以最大公约数);
 
  最起初,第一个数据为  1/(1*1), 即为 1, 分子,分母都为1;定义变量 fenzi =  1,fenmu = 1;
  在得到第二个组数  1/(1*2)的时候, 定义变量  fenmu1 = (1 * 2),然后进行分母同分,再定义变量          fenmu2 = fenmu * fenmu1 / gcd(fenmu, fenmu1),求最小公倍数;根据数学运算可以得出   fenzi,    然后fenmu = fenmu2(更新分母的值);
 
#include "stdio.h"
long long gcd(long long a, long long b){
    return b ? gcd(b, a % b) : a;
} 
int main(){
    int i, j, n;
    long long a[15], k, fenzi, fenmu, fenzi_, fenmu1, fenmu2;
    n = 13;
    a[1] = 1;a[2] = 1;
    for(i = 3; i <= 14; i++){
        a[i] = a[i -  1] + a[i - 2];
    }

    fenzi = 1, fenmu = 1;
    for(i = 2; i <= n; i++){
        fenmu1 = a[i] * a[i + 1];
        fenmu2 = fenmu * fenmu1 / gcd(fenmu, fenmu1);
        fenzi = fenmu2 / fenmu1 + fenmu2 / fenmu * fenzi;
        
        fenmu = fenmu2;
        k = gcd(fenzi, fenmu);//这里k就是再约分 分子和分母
        fenzi = fenzi / k;
        fenmu = fenmu / k;
    }

    printf("%lld/%lld\n",fenzi,fenmu);
    return 0;
} 

 


四  题目描述:

  小明同学最近喜欢上了排列组合,但是现在有这样的一道题把他难住了,已知有一组数字(2,5,3,6,3,6,7,3,7,8)共10个,对于这组数字进行排列后,可以将排列好的数字分为三个部分,且三个部分都是        分别有序的(升序或逆序),小明想知道能够有满足条件的多少种排列方式?

备注:

例如对于重新排列后的一种序列(2, 3, 3, 3, 5, 6, 6, 7, 7, 8)可以分为(2)(3,3,3)(5,6,6,7,7,8)三组或(2,3,3)(3,5,6,6)(7,7,8)三组所以该序列为满足题意的一种排列方式。

思路:

 用DFS对这十个数经行全排列,排列好检查是否满足条件,满足条件ans++;

 注意的地方就是这是个数里面有3 个 3,2 个 7,2 个 6;也就是说最后的结果要除以3!* 2!* 2!用来避免重复!

#include "stdio.h"
int b[10] = {2,5,3,6,3,6,7,3,7,8};
int a[10], book[10];
int n, ans = 0;
int check() {
    int i, j, flag = 0, cnt = 0;
    for(i = 0; i < n - 1; i++){
        if(a[i] < a[i + 1]){
            if(flag == -1){
                cnt++;
                flag = 0;
            }else{
                flag = 1;
            }
        }else if(a[i] > a[i + 1]){
            if(flag == 1){
                cnt++;
                flag = 0;
            }else{
                flag = -1;
            }
        }
    }
    if(cnt <= 2) return 1;
    return 0;
}
void dfs(int x) {//dfs全排列
    int i, j, k;
    if(x == 10) {
        if(check() == 1) {
            ans++;
            return;
        }
        return;
    }
    for(i = 0; i < n; i++) {
        if(book[i] == 0) {
            book[i] = 1;
            a[x] = b[i];

            dfs(x + 1);
            book[i] = 0;
        }
    }

}
int main() {
    int i, j;
    n = 10;

    dfs(0);
    printf("%d\n",ans / 24);

    return 0;

}

六 : 题目描述:

  又是努力刷题的一天。众所周知wyk是国一大佬喜欢帮群友解答问题。
  现在xmy好奇群里的聊天记录有多少条是@wyk的,但是他在忙着摸鱼。
  所以找到了你,给了你N条聊天记录,让你帮他算一下。
  注意:保证聊天记录的字母都是在ASSIC内。聊天记录存在空格,也可能以空格开头或结尾。@wyk必须连续才能生效,一条聊天记录保证在一行。

输入描述:

  第一行一个整数N   (1 ≤ N ≤ 10000)
  接下来N行字符串   (1 ≤l en(S) ≤ 200)

输出描述:

输出聊天记录有多少条是@wyk的

输入

10
abcbdaasddwj@wyk
dasdsafav@Alan
acdbbd@alan@wyk
@zbrnb
??CC??
abababab
wgyyds
@wykyyds
@wyk 111
endcccc@wyk

输出

5

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

int main() {
    char s[1000000];
    int n, i, j, l, ans = 0;
    scanf("%d",&n);
    getchar();
    for(i = 0; i < n; i++){
        gets(s);
        l = strlen(s);
        //getchar();
        for(j = 0; j < l; j++){
            if(s[j] == '@' && s[j + 1] == 'w' && s[j + 2] == 'y' && s[j + 3] == 'k'){
                ans++;
                break;
            }
        }
    }
    printf("%d\n",ans);
     
     
    return 0;
}

七 题目描述:

  这一天你来到了蓝桥杯的考场,你发现考场是一个N*M的矩阵。
  因为你的群友很多,你知道考场内每个人有多强,并且把实力换算成了数值。(因为有的人太弱了,所以可能出现实力值是负数的可能)
  你想知道考场内实力总和最大的矩阵区域的实力和是多少

输入描述:

  第一行两个整数 N M 
  第二到N+1行是一个N*M的矩阵代表考场内的情况  (−200 <= 实力值 <= 200)

输出描述:

请输出考场内实力总和最大的矩阵区域实力和是多少
示例1

输入

3 2
8 9
10 11
-4 11

输出

45
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
	ll n, m, x;
	ll ans = -1e9 + 7;
	cin >> n >> m;
	ll a[n + 5][m + 5];
	for(int i = 1; i <= n; i++) {
		for(int j =1; j <= m; j++) {
			cin >> x;
			a[i][j] = a[i][j - 1] + x;
		}
	}
	for(int i = 1; i <= m; i++) {
		for(int j = 0; j < i; j++) {
			ll c = 0;
			for(int k = 1; k <= n; k++) {
				c = c + a[k][i] - a[k][j];
				ans = max(ans, c);
				if(c < 0)    c = 0;
			}
		}
	}
	cout << ans << endl;
	return 0;
}

  

 
 
 

推荐阅读