蓝桥杯第十二届c++大学B组详解

目录

1.空间

2.直线

3.路径

4.卡片

5.货物摆放

6.时间显示

7.砝码称重

8.杨辉三角

9.双向排序

10.括号序列


 1.空间

 题目解析:1Byte = 8bit  1kb = 1024B  1MB = 1024kb;

先将256MB变成Byte = 256 * 1024 * 1024; 再将32位 变成Byte就是 32 / 8 = 4;

那么就是(256 * 1024 * 1024) / 4 = 67108864;

2.直线

 题目解析:直线方程式y= kx + b;

k = (y2 - y1)  / (x2 - x1);

b = (y1 * x2 - y2 * x1)  / (x2 - x1);

使用double类型怕精度损失。再使用set进行去重。最后还要考虑垂直和平行的情况就要加上m + n;

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


set<pair<double,double>> s;

void check(int x1, int y1, int x2, int y2)
{
    if(x1 == x2 || y1 == y2)//平行或者垂直;
        return;
    double k = (y2 - y1) * 1.0 / (x2 - x1);
    double b = (y1 * x2 - y2 * x1) * 1.0 / (x2 - x1);
    s.insert({k, b});
}

int main()
{
   for(int x1 = 0; x1 < 20; x1++)
   {
      for(int y1 = 0; y1 < 21; y1++)
      {
         for(int x2 = 0; x2 < 20; x2++)
         {
            for(int y2 = 0; y2 < 21; y2++)
            {
                 check(x1, y1, x2, y2);
            }
         }   
      }
   }
   cout << s.size() + 20 + 21<< endl;
   return 0;
}

3.路径

 题目解析:采用到一个弗洛伊德算法。大家可以自己再csdn里面看一下弗洛伊德算法求图的路径的博客,就很容易上手这个题目.使用二维数组进行存放连接的点。这个使用三次暴力可以在devc++里面跑几十秒就过了,但是在蓝桥杯官网会超时.但是这不重要,重要的是这是个填空题.

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
#define INT 0x3f3f3f3f
ll Edge[2022][2022];
int gcd(int a, int b)//最大公约数
{
	if (b == 0)
		return a;
	return gcd(b, a % b);
}
int lcm(int a, int b)//最小公倍数
{
	int c = a * b;
	return c / gcd(a, b);
}
int main()
{
	//初始化
	memset(Edge, INT, sizeof(Edge));
	for (int i = 1; i <= 2021; i++)
	{
		for (int j = 1; j <= 2021; j++)
		{
			if (i == j)Edge[i][j] = 0;
			else {
				if (abs(i - j) <= 21)//判断差的绝对值是否小于等于21
				{
					Edge[i][j] = lcm(i, j);
				}
			}
		}
	}

	for (int k = 1; k <= 2021; k++)
	{
		for (int i = 1; i <= 2021; i++)
		{
			for (int j = 1; j <= 2021; j++)
			{
				if (Edge[i][j] > Edge[i][k] + Edge[k][j])
				{
					Edge[i][j] = Edge[i][k] + Edge[k][j];
				}
			}
		}
	}
	cout << Edge[1][2021];
	return 0;
}

4.卡片

题目解析:动态dp又来罗, dp[i]表示i张卡片不重复的数量,并且我们可以弄出状态方程.

1张: 1;

2张: (1,1), (1,2),(2,2); 三种不重复的数量, 

3张: (1,1), (1,2), (2,2), (1,3), (2,3), (3,3); 就是六种不重复的数量,

那么状态方程dp[i] = ap[i - 1] + i;

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

int dp[100000] = {0};

int main()
{
   int n;
   cin >> n;
   dp[1] = 1;
   for(int i = 2; i < 10000; i++)
   {
      dp[i] = dp[i - 1] + i;
      if(n <= dp[i])
      {
         cout << i << endl;
         return 0;
      }
   }
   return 0;
}

5.货物摆放

 题目解析:暴力解法,但是还有要稍加修改。如果三个数中有两个是相同的那么一共有三种方法,如果三个数都不同就会有六种方法,三个数全部相同不符合题目意思。这个也是蓝桥杯官网跑不了,但是dev可以等个几十秒就出来了.

#include<iostream>
using namespace std;
#define n 2021041820210418
//n=a*b*c
typedef long long ll;
int ants = 0;
int main()
{
	for (ll a = 1; a * a * a <= n; a++)
	{
		if (n % a == 0)
		{
			for (ll b = a; a * b * b <= n; b++)
			{
				if (n / a % b == 0)
				{
					ll c = n / a / b;
					if (a == b && a == c)ants = 0;
					else if (a == b || a == c || c == b) ants += 3;
					else ants += 6;
				}
			}
		}
	}
	cout << ants << endl;
	return 0;
}

6.时间显示

 题目解析:根据题目意思进行划时间,但是输入的是毫秒需要变成秒。如果觉得很容易想错,你可以想一下有一个题目提取数字的每一位.

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    long long int n;
    cin >> n;
    n = n / 1000;
    n = n % 86400;//去掉除了最后一天的前面的天数;24*60*60
    int h, m, s;
    h = n / 3600;//求得最后一天的小时
    n = n % 3600;
    m = n / 60;//分钟
    s = n % 60;//秒数
    printf("%02d:%02d:%02d",h,m,s); //输出时间常用的形式,不用判断了
    return 0;
}

7.砝码称重

 题目解析:背包问题,采用动态dp,dp[i][j]表示第i个砝码拿到重量j的方案。如果第i-1个砝码可以拿到j个重量那么i个砝码也可以拿到j个重量, 同样i也可以拿到j重量加上/减去输入的砝码的重量,最后只要将可以称重的砝码进行加和就可以算出结果.

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

int dp[105][100005];

int main()
{
    int n;
    cin >> n;
    //从前i个物品中拿到总重量是j的集合。
    dp[0][0] = 1;

    for(int i = 1; i <= n; i++)
    {
        int a;
        cin >> a;
        for(int j = 0; j <= 100000; j++)
        {
           if(dp[i - 1][j])
           {
               dp[i][j] = 1;
               dp[i][j + a] = 1;
               dp[i][abs(j - a)] = 1;
           }
        }
    }

    int ans = 0;
    for(int i = 1; i <= 100000; i++)
    {
        if(dp[n][i])
           ans++;
    }
    cout << ans << endl;
    return 0;
}

8.杨辉三角

题目解析: 这里开始就变得不妙了,这题只过了部分用例,又更好的办法挺难想到的,大家可以看看其他佬的博客.鄙人不才写不出来.

观察上面的规律之后我们可以使用两个数组进行查找.两个数组不断变化每一层,我们就可以得到每一层的数据的位置.

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

vector<long long int> v1;
long long int n;
long long int ans = 0;//算n的位置的.

int main()
{
   cin >> n;
   if(n == 1)
   {
      cout << 1 << endl;
      return 0;
   }

   v1.push_back(1);
   ans++;

   for(int i = 0; i < v1.size(); i++)
   {
       vector<long long int> v2;
       if(i == 0)
       {
           v2.push_back(1);
           ans++;
       }
       else
       {
           ans++;
           if(n == v1[i - 1] + v1[i])
           {
               cout << ans << endl;
               return 0;
           }
           v2.push_back(v1[i - 1] + v1[i]);
       }

       ans++;
       v2.push_back(1);
       v2 = v1;
   }
   return 0;
}

9.双向排序

 题目解析:直接用sort进行排序.其他方法又会的大佬麻烦教教我,阿里嘎多.

 

#include<iostream>
#include<algorithm>
using namespace std;
int n,m,p,q;
int a[100005];

int cmp(int x, int y)
{
	return x > y;
}

int main()
{
	cin >> n >> m;
	for(int i = 0; i < n; i++)
	{
		a[i] = i+1;
	}
	
	while( m > 0 )
	{
		m--;
		cin >> p >> q;
		if(p == 0) 
		{
			sort(a, a+q, cmp);	// 逆排
		}
		else
		{
			sort(a+q-1, a+n);	// 正排
			
		}
	}
	for(int i = 0; i < n; i++)
		cout << a[i] << " ";
	return 0;
}

10.括号序列

 题目解析:这里贴一篇博主的优质博客大家看看吧,自己太菜了,还得多练练.

括号序列--蓝桥杯_括号序列蓝桥杯-CSDN博客

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
using namespace std;

typedef long long LL;
const int MOD=1000000007;
const int N=5010;
LL dp[N][N];
char str[N];
int len;
LL func()
{
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(int i=1;i<=len;i++)//一个括号一个括号的判断
    {
        if(str[i]=='(')
        {
            for(int j=1;j<=len;j++)
            {
                dp[i][j]=dp[i-1][j-1];//不用考虑dp[i][0] 因为dp[i-1][-1]是不合法的情况 不存在 为0
            }
        }
        else
        {
            dp[i][0]=(dp[i-1][0]+dp[i-1][1])%MOD;//特判防止越界 这里数据短,用的是优化前的推断
            for(int j=1;j<=len;j++)
            {
                 dp[i][j]=(dp[i-1][j+1] + dp[i][j-1])%MOD;
            }
        }
    }
    for(int i=0;i<=len;i++)
        if(dp[len][i]) return dp[len][i];//我们需要的就是长度为len添加括号的合法情况,而从前往后遍历出现的第一个有可能的情况就是需要括号数最少的情况,因为左括号可以加很多个,我们仅需添加最少的情况
        return -1;
}
int main()
{
    scanf("%s",str+1);//从下标为1开始
    len=strlen(str+1);
    LL l=func();
    reverse(str+1,str+len+1);
    for(int i=1;i<=len;i++)
    {
        if(str[i]=='(') str[i]=')';
        else str[i]='(';
    }
    LL r=func();
    cout<<l*r%MOD;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/532037.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4.进程相关 2

8.内存映射 8.1 内存映射相关定义 创建一个文件&#xff0c;将保存在磁盘中的文件映射到内存中&#xff0c;后期两个进程之间对内存中的数据进行操作&#xff0c;大大减少了访问磁盘的时间&#xff0c;也是一种最快的 IPC &#xff0c;因为进程之间可以直接对内存进行存取 8.…

第十二届蓝桥杯省赛真题(C/C++大学B组)

目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…

JVM性能监控与调优——命令行工具

文章目录 1、概述2、jps:查看正在运行的Java进程3、jstat&#xff1a;查看JVM统计信息4、jinfo&#xff1a;实时查看和修改JVM配置参数5、jmap&#xff1a;导出内存映像文件和内存使用情况6、jhat:JDK自带堆分析工具7、jstack&#xff1a;打印JVM中线程快照8、jcmd&#xff1a;…

第一个Swift程序

要创建第一个Swift项目,请按照以下步骤操作: 打开Xcode。如果您没有安装Xcode,可以在App Store中下载并安装它。在Xcode的欢迎界面上,选择“Create a new Xcode project”(创建新Xcode项目)。在模板选择界面上,选择“App”(应用程序)。在应用模板选择界面上,选择“Si…

【静态分析】静态分析笔记01 - Introduction

参考&#xff1a; BV1zE411s77Z [南京大学]-[软件分析]课程学习笔记(一)-introduction_南京大学软件分析笔记-CSDN博客 ------------------------------------------------------------------------------------------------------ 1. program language and static analysis…

【JavaWeb】Jsp基本教程

目录 JSP概述作用一个简单的案例&#xff1a;使用JSP页面输出当前日期 JSP处理过程JSP 生命周期编译阶段初始化阶段执行阶段销毁阶段案例 JSP页面的元素JSP指令JSP中的page指令Include指令示例 taglib指令 JSP中的小脚本与表达式JSP中的声明JSP中的注释HTML的注释JSP注释 JSP行…

llinux进程控制

学习进程创建,fork/vfork 学习到进程等待 学习到进程程序替换, 微型shell&#xff0c;重新认识shell运行原理 学习到进程终止,认识$? fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程…

PostgreSQL入门到实战-第十五弹

PostgreSQL入门到实战 PostgreSQL数据过滤(八)官网地址PostgreSQL概述PostgreSQL中LIKE命令理论PostgreSQL中LIKE命令实战更新计划 PostgreSQL数据过滤(八) 如何使用PostgreSQL LIKE运算符基于模式查询数据。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一…

Commitizen:规范化你的 Git 提交信息

简介 在团队协作开发过程中&#xff0c;规范化的 Git 提交信息可以提高代码维护的效率&#xff0c;便于追踪和定位问题。Commitizen 是一个帮助我们规范化 Git 提交信息的工具&#xff0c;它提供了一种交互式的方式来生成符合约定格式的提交信息。 原理 Commitizen 的核心原…

人工智能分类算法概述

文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式&#xff0c;将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用&#xff0c;如图…

每日一题(leetcode2529):正整数和负整数的最大计数--二分法

因为需要O&#xff08;logn&#xff09;的复杂度&#xff0c;所以考虑使用二分法&#xff0c;先找到负数里面的最大下标&#xff08;初始值定为-1&#xff09;&#xff0c;再找到第一个正数的下标&#xff08;初始值定为数组长度值&#xff09;。最后求出个数并进行比较即可。 …

操作系统的基础知识:操作系统的特征:并发,共享,虚拟,异步

操作系统的特性&#xff1a; 1.并发 并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的&#xff0c;但微观上是交替注意&#xff1a;并行:指两个或多个事件在同一时刻同时发生。 操作系统的并发性指计算机系统中“同时”运行着多个程序&#xff0c;这…

【Entity Framework】聊聊EF中键

【Entity Framework】聊聊EF中键 文章目录 【Entity Framework】聊聊EF中键一、概述二、配置主键2.1 约定配置主键2.2 单个属性配置为实体主键2.3 组合主键 三、主键名称四、键类型和值五、备用键 一、概述 键用作每个实体实例的唯一标识符。EF中的大多数实体都有一个键&#…

langchain-chatchat加载Azure Open AI

1.找到knowledge_base_chat.py文件中的get_ChatOpenAI函数 2.按crtl进入get_ChatOpenAI函数位置 3.注释原先的get_ChatOpenAI函数&#xff0c;修改成以下内容&#xff1a; def get_ChatOpenAI(model_name: str,temperature: float,streaming: bool True,callbacks: List[Ca…

5款最值得推荐的电脑监控软件丨高人气甄选

在企业和学校等场所&#xff0c;电脑监控软件被广泛应用于员工或学生的行为管理。 通过监控软件&#xff0c;管理者可以了解员工或学生的学习和工作情况&#xff0c;及时发现并纠正不当行为&#xff0c;提高工作效率和学习效果。同时&#xff0c;这类软件还可以用于保护企业机…

13 指针(上)

指针是 C 语言最重要的概念之一&#xff0c;也是最难理解的概念之一。 指针是C语言的精髓&#xff0c;要想掌握C语言就需要深入地了解指针。 指针类型在考研中用得最多的地方&#xff0c;就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。 本章专题脉络 1、指针…

SQL注入的其他攻击思路方法与Python脚本设计思路

SQL注入的其他攻击思路方法与Python脚本设计思路 也是很早就写了&#xff0c;也备个份吧 注意&#xff1a;在接下来的攻击方式中&#xff0c;由于实现的条件较为苛刻&#xff0c;并且需要较高权限&#xff0c;有的师傅又称之为高权限攻击 利用文件读取进行SQL注入 上一篇文章提…

mysql8主从复杂原理分析

MySQL 复制&#xff08;Replication&#xff09; 是官方提供的主从复制&#xff08;源到副本的复制&#xff09;方案&#xff0c;用于将一个 MySQL 的实例同步到另一个实例中。 这是使用最广泛的容灾方案&#xff08;重点掌握&#xff09;。 复制&#xff08;Replication&…

编译器如何理解C++的指针和引用?

初学引用时&#xff0c;往往很难真正理解引用&#xff0c;它与指针究竟有什么区别和联系。下面我们不妨看看编译器如何理解引用和指针的。 一.函数通过指针传参 1.1 示例代码 #include <iostream>using namespace std;void swap(int *x,int *y)//指针传参 {int tmp;t…

【机器学习300问】66、ReLU激活函数相对于Sigmoid和Tanh激活函数的优点是什么?ReLU它有局限性吗?如何改进?

一、ReLU相对于Sigmoid和Tanh的优点 &#xff08;1&#xff09;计算效率高 ReLU函数数学形式简单&#xff0c;仅需要对输入进行阈值操作&#xff0c;大于0则保留&#xff0c;小于0则置为0。Sigmoid和Tanh需要指数运算但ReLU不需要。所以相比之下它会更快&#xff0c;降低了神经…
最新文章