第十四届蓝桥杯省赛C++B组题解

考点

暴力枚举,搜索,数学,二分,前缀和,简单DP,优先队列,链表,LCA,树上差分

A 日期统计

暴力枚举:

#include<bits/stdc++.h>
using namespace std;
int b[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int a[50];
int h,m,s;
set<int>q;//用来排重
int main()
{  
    for(int i=1;i<=40;i++)//年份已固定,只用从后40位枚举
    {
        cin>>a[i];
    }
    for(int i=1;i<=40;i++)
        for(int j=i+1;j<=40;j++)
         for(int k=j+1;k<=40;k++)
             for(int p=k+1;p<=40;p++)
             {
                 h=a[i]*1000+a[j]*100+a[k]*10+a[p];
                 m=a[i]*10+a[j];
                 s=a[k]*10+a[p];
                 if(m>0&&m<=12&&s>0&&s<=b[m])
                     q.insert(h);
             }
    cout<<q.size()<<endl;
}

B 01串的熵

暴力枚举:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n = 23333333;
    for (int i = 1; i < n; ++i)
    {
        double a = i * 1.0 / n;  // 0出现的占比
        double b = (n - i) * 1.0 / n;  // 1出现的占比
        double res = 0;
        res -= a * log2(a) * i + b * log2(b) * (n - i);
        if (fabs(res - 11625907.5798) < 0.0001)
        {
            cout << i << endl;
            break;
        } 
    }
    return 0;
}

C 冶炼金属

解题思路:
最大值可以遍历比较得出,但是最小值要么使用数学公式,要么就是二分答案

公式法:

#include <iostream>
using namespace std;
typedef long long ll;
ll N,A[10010],B[10010],res[10010],res2[10010];
ll minres=1e9+7;
ll maxres2=-1;
int main()
{
  cin>>N;

  for(int i=0;i<N;i++){
      cin>>A[i]>>B[i];
      res[i]=A[i]/B[i];
      minres=min(minres,res[i]);
      res2[i]=A[i]/(B[i]+1);
      maxres2=max(maxres2,res2[i]);
  }
  
  cout<<maxres2+1<<" "<<minres;
  return 0;
}

二分答案:

#include<bits/stdc++.h>
using namespace std;
int a[200100],b[200100],n;
int find(int x){
	for(int i=1;i<=n;i++){
		if(a[i]/x>b[i]){
			return 1;
		}else if(a[i]/x<b[i]){
			return 0;
		}
	}
	return 0;
}
int main(){
	int minn=INT_MAX,maxx=INT_MAX;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
		maxx=min(maxx,a[i]/b[i]);
	}
	int l=0,r=1e9,mid=0;
	while(l<=r){
		mid=(l+r)/2;
		if(find(mid)){
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	cout<<l<<" "<<maxx<<endl;
	return 0;
}

D 飞机降落

题目大意:
给你n架飞机的到达,降落花费和可等待时间,让你求是否能全部安全降落

解题思路:
因为最大数据为10,直接上dfs,遍历所有情况,是否有可以降落的情况,注意一下回溯和边界处理就行。(多实例,记得将标记数组初始化)

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int t[20],d[20],l[20],vis[20];
int n,flag; 
void dfs(int sum,int ans){
	if(ans>=n){
		flag=1;
		return ;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]&&(sum<=t[i]||sum<=t[i]+d[i])){
			if(sum<=t[i]){
				vis[i]=1;
				dfs(t[i]+l[i],ans+1);
			}else if(sum<=t[i]+d[i]){
				vis[i]=1;
				dfs(sum+l[i],ans+1);
			}else{
				continue;
			}
			vis[i]=0;
		}
	}
} 
void solve(){
	memset(vis,0,sizeof(vis));
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>t[i]>>d[i]>>l[i];
	}
	flag=0;
	dfs(0,0);
	if(flag){
		cout<<"YES"<<endl;
	}else{
		cout<<"NO"<<endl;
	}
	return ;
}
signed main()
{
	IOS
	int t=1;
	cin>>t;
	while(t--)
	solve();
    return 0;
}

E 接龙数列

题目大意:

给你n个数,问你删除几个可以将剩下的组成接龙数列。

解题思路:
因为接龙数列只需要判断首个数字和末尾数字,而且只能有 0 − 9 0-9 09十种可能,所以,只需要开一个dp数组,将每个数的首个数字和末尾数字进行存储,并更新以末尾数字结尾的数组,即是否小于当前以首个数字结尾的接龙数列的长度+1的长度,小于则更新,最后输出最长的一个接龙数列的长度即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int dp[20];
void solve(){
	int n,maxx=0,a,b;
	string x;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		a=x[0]-'0';
		b=x[x.size()-1]-'0';
		dp[b]=max(dp[b],dp[a]+1);
		maxx=max(dp[b],maxx);
	}
	cout<<n-maxx<<endl;
	return ;
}
signed main()
{
	IOS
	int t=1;
	//cin>>t;
	while(t--)
	solve();
    return 0;
}

F 岛屿个数

题目大意:
给你一个n*m的矩阵,由海0和陆地1组成,一个1围成的还就是一个岛屿,但是岛屿里面的岛屿属于子岛屿,不属于岛屿的范畴,让你求一共由多少个岛屿。

解题思路:
因为有环中环的情况,而且只需要判断最外环的情况,所以从最外围的海水开始遍历,接触到最外围海水的一定是岛屿,然后就先dfs一遍把最外围海水标记了,再从外围海水向陆地dfs一遍,每次遍历岛屿数量都加一,最后得出结果。

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

int M, N, d[52][52];

void dfs_sea(int i, int j)
{
    if ((i >= 0 && i <= M + 1) && (j >= 0 && j <= N + 1))
    {
        if (d[i][j] == 0)
        {
            d[i][j] = 2;//标记出外海
            //八个方向 
            dfs_sea(i, j + 1);
            dfs_sea(i, j - 1);
            dfs_sea(i + 1, j);
            dfs_sea(i + 1, j + 1);
            dfs_sea(i + 1, j - 1);
            dfs_sea(i - 1, j);
            dfs_sea(i - 1, j + 1);
            dfs_sea(i - 1, j - 1);
        }
    }
}

void dfs_island(int i, int j)
{
    if ((i >= 0 && i <= M + 1) && (j >= 0 && j <= N + 1))
    {
        if (d[i][j] == 1)
        {
            d[i][j] = 3;//搜索过的岛屿不再搜索 
            dfs_island(i + 1, j);//右 
            dfs_island(i - 1, j);//左 
            dfs_island(i, j + 1);//上 
            dfs_island(i, j - 1);//下 
        }
    }
}

int main(int argc, char *argv[])
{
    // 请在此输入您的代码
    int T;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d %d", &M, &N);
        //填充海水
        for (int i = 0; i < N + 2; i++)
        {
            d[0][i] = 0;
            d[M + 1][i] = 0;
        }
        for (int i = 1; i < M + 1; i++)
        {
            d[i][0] = 0;
            d[i][N + 1] = 0;
        }
        //输入图 
        for (int i = 1; i < M + 1; i++)
        {
            for (int j = 1; j < N + 1; j++)
            {
                scanf("%1d", &d[i][j]);
            }
        }

        dfs_sea(0, 0); //找出所有外海 

        int count;//计算岛屿数量 
        count = 0;
        for (int i = 0; i < M + 2; i++)
        {
            for (int j = 0; j < N + 2; j++)
            {
                if (d[i][j] == 1 && d[i - 1][j] == 2)//只能从外海搜索岛屿,所以岛屿前一定是外海“2”
                {
                    dfs_island(i, j);//搜索岛屿 
                    count++;
                }
            }
        }
        printf("%d\n", count);
    //以下代码可以打印出处理后的图
        /*for (int i = 0; i < M + 2; i++)
        {
            for (int j = 0; j < N + 2; j++)
            {
                printf("%1d", d[i][j]);
                if (j == N + 1)
                printf("\n");
            }
        }*/
    }
    return 0;
}

G 子串简写

题目大意:给定一个字符串和一个长度K,再给出两个字符a和b,求字符串有多少个长度大于等于K且是以a为首字母,b为尾字母的子串。

解题思路:
因为只需要判断首尾,所以可以直接从字符串的尾部向前遍历并用前缀和来记录b字符的个数,最后字符串从前往后遍历,每遇到一个a字符,就判断在其k-1的长度后,有多少个b字符,将其数量累加,最后输出即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int sum[1000100];
void solve(){
	int n,num=0;
	string x;
	char aa,bb;
	cin>>n;
	cin>>x;
	cin>>aa>>bb;
	for(int i=x.size()-1;i>=0;i--){
		if(x[i]==bb){
			sum[i]+=sum[i+1]+1;
		}else{
			sum[i]+=sum[i+1];
		}
	}
	for(int i=0;i<x.size();i++){
		if(x[i]==aa){
			num+=sum[i+n-1];
		}
	}
	cout<<num<<endl;
	return ;
}
signed main()
{
	IOS
	int t=1;
	//cin>>t;
	while(t--)
	solve();
    return 0;
}

H 整数删除

题目大意:给你n个数,和k次操作,每次操作将当前剩余数中最小数的左右两个数加上当前最小数的值(多个最小数从前往后进行操作,左边或者右边没有数则不操作),并将这个最小数剔除,问你k次操作后的序列是什么。

解题思路:
因为需要动态维护最小值,所以使用优先队列,但是因为每次进行操作后,最小值可能会发生变化,所以需要加上双向链表进行优化。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 5e5 + 10;
ll v[N], l[N], r[N];

void del(int x) {
    r[l[x]] = r[x], l[r[x]] = l[x];
    v[l[x]] += v[x], v[r[x]] += v[x];
}

int main () {
    int n, k; cin >> n >> k;
    r[0] = 1, l[n + 1] = n;
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> h;
    for (int i = 1; i <= n; i ++)
        cin >> v[i], l[i] = i - 1, r[i] = i + 1, h.push({v[i], i});
    while (k --) {
        auto p = h.top(); h.pop();
        if (p.first != v[p.second]) h.push({v[p.second], p.second}), k ++;
        else del(p.second);
    }
    int head = r[0];
    while (head != n + 1) {
        cout << v[head]<< " ";
        head = r[head];
    }
    return 0;
}

最后两题考到了LCA算法,有点属于盲区了算是,回去恶补一下,两周内题解补上!!!

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

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

相关文章

【Unity动画】Unity如何导入序列帧动画(GIF)

Unity 不支持GIF动画的直接播放&#xff0c;我们需要使用序列帧的方式 01准备好序列帧 02全部拖到Unity 仓库文件夹中 03全选修改成精灵模式Sprite 2D ,根据需要修改尺寸&#xff0c;点击Apply 04 创建一个空物体 拖动序列上去 然后全选所有序列帧&#xff0c;拖到这个空物体…

护眼灯和白炽灯哪个更保护眼睛?四款必选的高口碑护眼台灯

我认为肯定是护眼灯更护眼一点的&#xff0c;虽说白炽灯价格较低&#xff0c;不过侧面也放映了一个问题&#xff0c;那就是技术和光源的成本并不高&#xff0c;这也导致了容易出现散热性不好&#xff0c;光线刺眼等等问题。相较之下护眼灯通常使用更节能环保的LED灯&#xff0c…

idea2023 运行多 springboot 实例

概要 1、修改idea运行多实例&#xff08;本地测试负载&#xff09; 你可能用到其他 1、改造项目缓存token 至redis 支持负载均衡部署 SpringSecurity6.0RedisJWTMP基于token认证功能开发&#xff08;源码级剖析可用于实际生产项目&#xff09;_springsecurity redis管理token…

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式&#xff1a; 序列号&#xff1a;通过SYN传给接收端&#xff0c;当SYN为1&#xff0c;表示请求建立连接&#xff0c;且设置序列号初值&#xff0c;后面没法送一次数据&#xff0c;就累加数据大小&#xff0c;保证包有序。 确认应答号&#x…

外贸网站常用的wordpress模板

零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jianzhanpress.com/?p4912 WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建w…

学习笔记Day8:GEO数据挖掘-基因表达芯片

GEO数据挖掘 数据库&#xff1a;GEO、NHANCE、TCGA、ICGC、CCLE、SEER等 数据类型&#xff1a;基因表达芯片、转录组、单细胞、突变、甲基化、拷贝数变异等等 常见图表 表达矩阵 一行为一个基因&#xff0c;一列为一个样本&#xff0c;内容是基因表达量。 热图 输入数据…

用JDBC游标的方式导出mysql数据以及springboot打包成exe程序实践

用JDBC实现游标查询&#xff0c;关键代码在于 Statement 的 fetchSize 属性的设置。 ExportDataService import cn.hutool.core.io.FileUtil; import cn.hutool.core.text.csv.CsvUtil; import cn.hutool.core.text.csv.CsvWriter; import cn.hutool.core.util.StrUtil; impo…

每天一个数据分析题(二百一十六)

在弹性网回归&#xff08;Elastic Net Regression&#xff09;中&#xff0c;正则项是L1和L2正则项的线性组合。其公式为&#xff1a; 在这里&#xff0c;r 是混合参数&#xff0c;0≤r≤1。如果 r0&#xff0c;弹性网回归等效为( )&#xff1a; A. L2正则回归&#xff08;岭…

SpringBoot2.7集成Swagger3

Swagger2已经在17年停止维护了&#xff0c;取而代之的是 Swagger3&#xff08;基于openApi3&#xff09;&#xff0c;所以新项目要尽量使用Swagger3. Open API OpenApi是业界真正的 api 文档标准&#xff0c;其是由 Swagger 来维护的&#xff0c;并被linux列为api标准&#x…

AcWing 1510:楼梯 ← 浮点数二分

【题目来源】http://poj.org/problem?id2507https://www.acwing.com/problem/content/1512/【题目描述】 一个街道两侧有两栋楼&#xff0c;现在有如图所示两楼梯 x&#xff0c;y。 两个楼梯分别如图放置。 已知两个楼梯的长度和他们交点离地面的高度&#xff0c;求两栋楼之间…

基于Matlab的视频人面检测识别,Matalb实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

CTF 题型 SSRF攻击例题总结

CTF 题型 SSRF攻击&例题总结 文章目录 CTF 题型 SSRF攻击&例题总结Server-side Request Forgery 服务端请求伪造SSRF的利用面1 任意文件读取 前提是知道要读取的文件名2 探测内网资源3 使用gopher协议扩展攻击面Gopher协议 &#xff08;注意是70端口&#xff09;python…

JVM中对象创建过程

在JVM中对象的创建&#xff0c;我们从一个new指令开始&#xff1a; 这个过程大概图示如下&#xff1a; 虚拟机收到new指令触发。 类加载检查&#xff1a;如果类没有被类加载器加载&#xff0c;则执行类加载流程&#xff08;将class信息加载到JVM的运行时数据区的过程&#xff…

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署&#xff0c;那么如何进行部署呢&#xff0c;先把微服务的各个服务和中间件以及对应的端口列举出来&#xff0c;都打包成镜像&#xff0c;以及前端代码部署的nginx&#xff0c;使用docker-compose启动&#xff0c;访问服务器nginx…

[LLM]大语言模型文本生成—解码策略(Top-k Top-p Temperature)

{"top_k": 5,"temperature": 0.8,"num_beams": 1,"top_p": 0.75,"repetition_penalty": 1.5,"max_tokens": 30000,"message": [{"content": "你好","role": "user&…

【07】进阶html5

HTML5 包含两个部分的更新,分别是文档和web api 文档 HTML5 元素表 元素语义化 元素语义化是指每个 HTML 元素都代表着某种含义,在开发中应该根据元素含义选择元素 元素语义化的好处: 利于 SEO(搜索引擎优化)利于无障碍访问利于浏览器的插件分析网页新增元素 多媒体…

C语言黑魔法第三弹——动态内存管理

本文由于排版问题&#xff0c;可能稍显枯燥&#xff0c;但里面知识点非常详细&#xff0c;建议耐心阅读&#xff0c;帮助你更好的理解动态内存管理这一C语言大杀器 进阶C语言中有三个知识点尤为重要&#xff1a;指针、结构体、动态内存管理&#xff0c;这三个知识点决定了我们…

CentOS 7 编译安装 Nginx

CentOS 7 编译安装 Nginx 背景下载 Nginx 源码包安装依赖包编译添加环境变量添加守护查考文献 背景 一开始使用 docker 搭建了一个 web 服务器&#xff0c;但是由于 docker 不太方便的部署 TLS 证书&#xff0c;故使用 Nginx 做反向代理&#xff0c;实现 https 连接。 下载 N…

spring-boot-starter-thymeleaf加载外部html文件

在Spring MVC中&#xff0c;我们可以使用Thymeleaf模板引擎来实现加载外部HTML文件。 1.Thymeleaf介绍 Thymeleaf是一种现代化的服务器端Java模板引擎&#xff0c;用于构建漂亮、可维护且易于测试的动态Web应用程序。它适用于与Spring框架集成&#xff0c;并且可以与Spring M…

什么是通用人工智能(AGI)?

人工智能(AI)驱动的工具现在无处不在。谷歌最近在Gmail、谷歌文档和谷歌搜索中添加了AI。微软在必应、Word、Excel和其他Office应用程序中添加了AI。甚至苹果也在悄悄地向其最新的iPhone添加AI功能。这甚至还没有考虑到特定的AI应用程序&#xff0c;如OpenAI的ChatGPT和Stabili…
最新文章