【第十一届蓝桥杯真题】【省赛】【第一场】【C++B组】【学习笔记】蓝桥杯每日一练day4

小题做做,大题开摆🤗🤗🤗,四舍五路,我就是在前进的路上捏🤗

A、跑步训练(5分)

在这里插入图片描述

我就怕这种细节题,一不小心就寄寄辣,还是写稳点好

#include<iostream>
using namespace std;
int main()
{
	int health = 10000;
	int run = 600;
	int rest = 300;
	int res = 0;
	while(health >= run)
	{
		health -= run;
		res += 60;
		health += rest;
		res += 60;
	}
	if(health) res += health / (run / 60);
	cout<<res<<endl;
	
	return 0;
} 
// 3880

B、纪念日(5分)

在这里插入图片描述

我害怕爆int,所以猥琐点,用long long,结果没报🤡哈哈

#include<iostream>
using namespace std;
typedef long long LL;
int months[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool flag1,flag2;	// 为了让第一次从7月23日开始 
int main()
{
	LL res = 0;
	for(int year = 1921 ; year <= 2020 ; year++)
	{
		int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
		months[2] = 28 + leap;
		for(int month = 1 ; month <= 12 ; month++)
		{
			if(!flag1)
			{
				month = 7;
				flag1 = true;
			}
			for(int day = 1 ; day <= months[month] ; day++)
			{
				if(!flag2)
				{
					day = 24;
					res += 12 * 60;
					flag2 = true;
				}
				if(year == 2020 && month == 7 && day == 1)
				{
					res += 12 * 60;
					cout<<res<<endl;
					return 0;
				}
				res += 24 * 60;
			}
		}
	}
	return 0;
} 
// 52038720

C、合并检测(10分)

在这里插入图片描述

我们枚举k,我觉得是10
#include<iostream>
using namespace std;
int main()
{
	int perCnt = 100;		// 假设有100个人检测,那边就有1人是感染者
	int ans = 99999;		// 设一个最大值 
	for(int k = 1 ; k <= 100 ; k++)
	{
		int t = perCnt / k + k;
		ans = min(ans,t);
	}
	cout<<ans<<endl;
	return 0;
} 

D、REPEAT程序(10分)

在这里插入图片描述

这真不怪我,题都无了

E、矩阵(15分)

在这里插入图片描述

F、整除序列(15分)

在这里插入图片描述

#include<iostream>
using namespace std;
long long n;
int main()
{
    cin >> n;
    while(n)
    {
       cout<< n  <<' ';
        n /= 2;
    }
    return 0;
}

G、解码(20分)

在这里插入图片描述

【数据范围】

输入字符串由大小写英文字母和数字组成,长度不超过 100100。
请注意原来的串长度可能超过 100100。

【输入样例】

H3el5o2

【输出样例】

HHHellllloo

我们在这里整一串,新的字符串

#include <iostream>

using namespace std;

int main()
{
  string s,str;
  cin>>s;
  for(int i = 0 ; i < s.size() ; i++)
      if(i + 1 < s.size() && s[i + 1] <= '9' && s[i + 1] >= '1')
      {
        int k = s[i + 1] - '0';
        while(k--)
            str += s[i];
        i++;
      }
      else
        str += s[i];
  cout<<str<<endl;
  return 0;
}

H、走方格(20分)

在这里插入图片描述

小小DP一题,轻松拿下

在这里插入图片描述

#include<iostream>
using namespace std;
int n,m;
const int N = 40;
int f[N][N];
int main()
{
    cin>>n>>m;
    f[1][1] = 1;
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
        {
            if(i == 1 && j == 1) continue;
            if(i % 2 || j % 2)
                f[i][j] = f[i-1][j] + f[i][j-1];
        }
    cout<<f[n][m]<<endl;
    return 0;
}

I、整数拼接 (25分)

在这里插入图片描述

J、网络分析(25分)

小明正在做一个网络实验。

他设置了 n 台电脑,称为节点,用于收发和存储数据。

初始时,所有节点都是独立的,不存在任何连接。

小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。

两个节点如果存在网线连接,称为相邻。

小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转=发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。

所有发送和接收的节点都会将信息存储下来。

一条信息只存储一次。

给出小明连接和测试的过程,请计算出每个节点存储信息的大小。

【输入格式】

输入的第一行包含两个整数 n,m 分别表示节点数量和操作数量。

节点从 1 至 n 编号。

接下来 m 行,每行三个整数,表示一个操作。

  • 如果操作为 1 a b,表示将节点 a 和节点 b 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。
  • 如果操作为 2 p t,表示在节点 p 上发送一条大小为 t 的信息。

【输出格式】

输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行完上述操作后节点 1 至节点 n 上存储信息的大小。

【数据范围】

1≤n≤10000,
1≤m≤ 1 0 5 10^5 105,
1≤t≤100

【输入样例1:】

4 8
1 1 2
2 1 10
2 3 5
1 4 1
2 2 2
1 1 2
1 2 4
2 2 1

【输出样例1:】

13 13 5 3

这个考察并查集,开摆,附y总代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 10010;

int n, m;
int p[N], d[N];

int find(int x)
{
    if (p[x] == x || p[p[x]] == p[x]) return p[x];
    int r = find(p[x]);
    d[x] += d[p[x]];
    p[x] = r;
    return r;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) p[i] = i;
    while (m -- )
    {
        int t, a, b;
        scanf("%d%d%d", &t, &a, &b);
        if (t == 1)
        {
            a = find(a), b = find(b);
            if (a != b)
            {
                d[a] -= d[b];
                p[a] = b;
            }
        }
        else
        {
            a = find(a);
            d[a] += b;
        }
    }

    for (int i = 1; i <= n; i ++ )
        if (i == find(i)) printf("%d ", d[i]);
        else printf("%d ", d[i] + d[find(i)]);
    puts("");

    return 0;
}

每日练习3题

纯质数 - 蓝桥云课 (lanqiao.cn)

0 和1 不是质数嗷,来一个埃氏筛n(longn)

#include<iostream>
using namespace std;
const int N = 20210605 + 10;
int primes[N],cnt;
bool st[N];
int n = 20210605;
bool check(int x)
{
  int t = x;
  while(t)
  {
    if(st[t % 10])
      return false;
    t /= 10;
  }
  return true;
}
void get_primes(int n)
{
    for(int i = 2 ; i <= n ; i++)
    {
        if(!st[i])
        {
          if(check(i)) primes[cnt ++] = i;
          for(int j = i + i ; j <= n ; j += i) st[j] = true;
        }
    }
}
int main()
{
    st[0] = st[1] = true;   // 0 和 1 不是质数
    get_primes(n);
    cout<<cnt<<endl;
    return 0;
}

最少砝码 - 蓝桥云课 (lanqiao.cn)

没搞明白

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int i, k;
    cin >> k;
    for (i = 1; ; i++)
    {
        if (k == 1)
        {
            cout << i;
            return 0;
        }
        int t = (pow(3, i) - 1) / 2;
        int r = (pow(3, i + 1) - 1) / 2;
        if (t < k && r >= k )
            break;
    }
    cout << i + 1;
    return 0;

}

灌溉 - 蓝桥云课 (lanqiao.cn)

这是我第二次被曼哈顿距离薄纱,我还搁那研究双端队列广搜呢

#include<iostream>
using namespace std;
const int N = 100 + 10;
int n, m, t, r[N], c[N];
int main()
{
    cin >> n >> m >> t;
    for(int i = 1;i <= t;i ++)
        cin >> r[i] >> c[i];
    int k;
    cin >> k;
    int cnt = 0;
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= m;j ++)
        {
            for(int l = 1; l <= t; l ++)
            {
                int d = abs(r[l] - i) + abs(c[l] - j);
                if(d <= k)
                {
                    cnt ++;
                    break;
                }
            }
        }
    }
    cout << cnt << endl;
}

真不如开摆有意思,开摆立即上天堂😇

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
第十一届蓝桥杯省赛第二场java大学b真题共分为两道编程题和一道综合应用题,以下是真题及解析。 第一题是给定一个字符串,求出字符串中所有数字的总和。首先我们可以使用正则表达式来匹配字符串中的数字,然后将匹配到的数字累加起来即可。可以使用Java中的Pattern和Matcher类来实现正则匹配,具体代码如下: ```java import java.util.regex.*; public class Main { public static void main(String[] args) { String str = "abc123def456ghi789"; int sum = 0; Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(str); while(matcher.find()) { sum += Integer.parseInt(matcher.group()); } System.out.println("数字总和为:" + sum); } } ``` 第二题是给定两个字符串,判断第二个字符串是否是第一个字符串的子串。可以使用Java中的contains()方法来判断一个字符串是否包含另一个字符串。具体代码如下: ```java public class Main { public static void main(String[] args) { String str1 = "abcdefg"; String str2 = "cde"; if (str1.contains(str2)) { System.out.println("第二个字符串是第一个字符串的子串!"); } else { System.out.println("第二个字符串不是第一个字符串的子串!"); } } } ``` 综合应用题是实现一个简单的计算器,根据输入的两个数字和运算符进行相应的运算并输出结果。我们可以使用Java中的Scanner类来获取用户输入的数字和运算符,并根据运算符进行相应的运算。具体代码如下: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入第一个数字:"); int num1 = scanner.nextInt(); System.out.print("请输入第二个数字:"); int num2 = scanner.nextInt(); System.out.print("请输入运算符(+、-、*、/):"); String operator = scanner.next(); double result = 0; switch(operator) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": result = num1 / num2; break; default: System.out.println("无效的运算符!"); } System.out.println("计算结果为:" + result); } } ``` 以上就是第十一届蓝桥杯省赛第二场java大学b真题及解析的回答,希望能对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值