(蓝桥杯)1125 第 4 场算法双周赛题解+AC代码(c++/java)

2023-12-01 11:04

本文主要是介绍(蓝桥杯)1125 第 4 场算法双周赛题解+AC代码(c++/java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目一:验题人的生日【算法赛】

验题人的生日【算法赛】 - 蓝桥云课 (lanqiao.cn)

思路:

1.又是偶数,又是质数,那么只有2喽

AC_Code:C++

#include <iostream>
using namespace std;
int main()
{cout<<2;return 0;
}

AC_Code:java

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println(2);scan.close();}
}

题目二:蓝桥小课堂【算法赛】

蓝桥小课堂【算法赛】 - 蓝桥云课 (lanqiao.cn)

思路:

1.组成三角形的条件,任意两边大于第三边

2.注意不要用sqrt函数,因为输出的是面积的平方,最后直接输出即可,用sqrt函数时可能有的数据不是平方数,开放后会有精度损失,导致一直无法AC

AC_Code:C++

#include <iostream>
using namespace std;typedef long long LL;int main()
{LL a,b,c;   cin>>a>>b>>c;if(a+b>c&&a+c>b&&b+c>a){  //任意两边大于第三边LL s=(a+b+c)/2;LL ans=s*(s-a)*(s-b)*(s-c);cout<<ans<<endl;}else cout<<-1<<endl;return 0;
}

AC_Code:java

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);long a=sc.nextLong(),b=sc.nextLong(),c=sc.nextLong();if(a+b>c&&a+c>b&&b+c>a){ //任意两边大于第三边long s=(a+b+c)/2;long ans=s*(s-a)*(s-b)*(s-c);System.out.println(ans);}else System.out.println(-1);}
}

题目三:压缩矩阵【算法赛】

压缩矩阵【算法赛】 - 蓝桥云课 (lanqiao.cn)

思路:找规律/数学

1.第一行和最后一行是两个数,其他行都是三个数

2.先算出行,算出行后让列也等于行,用x模3看余数是几,看是需要偏移,余数为1向右偏移一位,余数为2向左偏移一位,余数为0不需要偏移

3.算行的话就是找规律了,(x+4)/3就是行

AC_Code:C++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>using namespace std;typedef long long LL;
typedef pair<int,int>PII;#define x first
#define y second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()int const mod1=998244353;   
int const mod2=1e9+7;
int const N=2e5+7;
int const INF=0x3f3f3f3f;int T;
int m;
int a[N];
string s;void solve(){LL n;scanf("%lld%d", &n, &m);while (m -- ){LL x;scanf("%lld", &x);LL row=(x+4)/3; //计算行LL col=row;//看是否需要向左右偏移if(x%3==2)  col--;else if(x%3==1) col++;printf("%lld %lld\n",row,col);}
} void init(){                     }int main()
{//std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);T=1;//cin>>T;//scanf("%d",&T);init();while(T--){solve();}return 0;
}

AC_Code:java

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc=new Scanner(System.in);long n=sc.nextLong();int q=sc.nextInt();while(q-->0) {long x=sc.nextLong();long row=(x+4)/3; //算出行long col=row;//看是否要向左右偏移if(x%3==1)  col++;else if(x%3==2)  col--;System.out.println(row+" "+col);}}
}

题目四:恒纪元【算法赛】

恒纪元【算法赛】 - 蓝桥云课 (lanqiao.cn)

思路:

1.乱纪元的增长速度是非常快的,(2^40>1e12)所以乱纪元是非常少的,那么可以预处理出所有的乱纪元

2.对于每一个询问s,暴力找到大于s的第一个恒纪元t,再暴力(二分也可以)找到第一个大于t的乱纪元,用第一个大于t的乱纪元-t就是恒纪元可以持续的天数了

3.这个的预处理其实是一个谜(预处理不好很容易只能过25%的测试样例),预处理出小于1e13次方的乱纪元就可以过

AC_Code:C++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>using namespace std;typedef long long LL;
typedef pair<int,int>PII;#define x first
#define y second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()int const mod1=998244353;   
int const mod2=1e9+7;
int const N=2e5+7;
LL const INF=1e13;int T;
int n,q;
int x,y,z;
set<LL>vis; //存储乱纪元LL qpow(int a,int b){LL res=1;for(int i=0;i<b;i++){res=res*a;if(res>INF) return -1;  //大于正无穷了}return res;
}void solve(){scanf("%d%d%d",&x,&y,&z);for(int i=0;i<=40;i++){LL a=qpow(x,i);if(a==-1)   break;//大于正无穷了for(int j=0;j<=40;j++){LL b=qpow(y,j);if(b==-1)   break;//大于正无穷了for(int k=0;k<=40;k++){LL c=qpow(z,k);if(c==-1)   break;//大于正无穷了LL s=a+b+c;if(s>INF)   break;  //三者相加大于正无穷vis.insert(s);}}}scanf("%d",&q);while(q--){LL s;   scanf("%lld",&s);   LL t=s+1;while(vis.count(t)) t++;    //找到第一个恒纪元//二分找到第一个大于t的乱纪元,相减求恒纪元持续了多少天printf("%lld %lld\n",t,*vis.upper_bound(t)-t);}
} void init(){                     }int main()
{//std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);T=1;//cin>>T;//scanf("%d",&T);init();while(T--){solve();}return 0;
}

AC_Code:java


import com.sun.source.tree.Tree;import java.util.*;public class Main {static final long INF=(long)1e13;static long qpow(int a,int b){long res=1;for(int i=0;i<b;i++)    {res=res*a;if(res>INF) return -1;}return res;}public static void main(String[] args) {Scanner sc=new Scanner(System.in);TreeSet<Long> vis=new TreeSet<>();List<Long> list=new ArrayList<>();int x=sc.nextInt(),y=sc.nextInt(),z=sc.nextInt();//预处理乱纪元for(int i=0;i<=40;i++){long a=qpow(x,i);if(a==-1)   break; //大于正无穷for(int j=0;j<=40;j++){long b=qpow(y,j);if(b==-1)   break; //大于正无穷for (int k = 0; k < 40; k++) {long c=qpow(z,k);if(c==-1)   break;  //大于正无穷long s=a+b+c;if(s>INF)   break;  //三者相加大于正无穷if(!vis.contains(s)){list.add(s);vis.add(s);}    }}}Collections.sort(list); //集合排序int q=sc.nextInt();while(q-->0){long s=sc.nextLong();long t=s+1;//找到第一个恒纪元while(vis.contains(t))  t++;//找到大于第一个横纪元的乱纪元int idx=-1;for (int i = 0; i < list.size(); i++) {if(list.get(i)>t){idx=i;break;}}//第一个大于t的乱纪元-减去恒纪元System.out.println(t+" "+(list.get(idx)-t));// System.out.println(t+" "+(vis.ceiling(t+1)-t));   //二分}                   //ceiling相当于lower_bound}
}

题目五:充能计划【算法赛】

充能计划【算法赛】 - 蓝桥云课 (lanqiao.cn)

思路:

简述题意:n个引擎,m种宝石,q个询问,每个询问选出一种宝石p,放到第k个引擎上,此时区间[k,min(n,k+s[p]-1)]都会放入p这个宝石,s数组为每个宝石的充能范围,最后问n种引擎宝石的数量

1.对n个引擎开n个set,对每个询问的合法区间都加入宝石p,最后对每个引擎输出set的大小,时间复杂度o(n^2),会tle的,怎么优化呢?

2.可以对每种宝石分组,对每一个询问记录区间,最后对每种宝石合并区间(注意合并区间前要对左端点排序),合并区间后用差分记录左右端点位置

3.最后累加差分,计算答案

AC_Code:C++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>using namespace std;typedef long long LL;
typedef pair<int,int>PII;#define x first
#define y second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()int const mod1=998244353;   
int const mod2=1e9+7;
int const N=2e5+7;
int const INF=0x3f3f3f3f;int T;
int n,m,q;
int s[N];
vector<PII>line[N]; //line[i]:存储宝石i的所有区间
int diff[N];void solve(){scanf("%d%d%d", &n, &m,&q);for(int i=1;i<=m;i++)   scanf("%d",s+i);while(q--){int p,k;    scanf("%d%d",&p,&k);line[p].push_back({k,min(n,k+s[p]-1)});}for(int i=1;i<=m;i++){if(line[i].empty()) continue;sort(line[i].begin(),line[i].end());  //按左端点排序int l=line[i][0].x,r=line[i][0].y;//区间合并,差分for(PII p:line[i]){if(r>=p.x)  r=max(r,p.y);else{diff[l]++;diff[r+1]--;l=p.x;r=p.y;}}diff[l]++;  diff[r+1]--;}int ans=0;  //累加查分计算答案for(int i=1;i<=n;i++){ ans+=diff[i];printf("%d ",ans);}} void init(){                     }int main()
{//std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);T=1;//cin>>T;//scanf("%d",&T);init();while(T--){solve();}return 0;
}

AC_Code:java

import com.sun.source.tree.Tree;import java.util.*;public class Main {static int N=(int)1e5+7;static int[] s=new int[N];static List<Line>[] line=new ArrayList[N];static int[] diff=new int[N];public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt(),m=sc.nextInt(),q=sc.nextInt();for(int i=1;i<=m;i++)   {s[i]=sc.nextInt();line[i]=new ArrayList<Line>();}while(q-->0){int p=sc.nextInt(),k=sc.nextInt();line[p].add(new Line(k,Math.min(n,k+s[p]-1)));  //按宝石种类分组}for(int i=1;i<=m;i++) {if (line[i].isEmpty()) continue;Collections.sort(line[i]);  //排序//区间合并,差分操作int l = line[i].get(0).l, r = line[i].get(0).r;for (Line p : line[i]) {if (r >= p.l) r = Math.max(r, p.r);else {diff[l]++;diff[r + 1]--;l = p.l;r = p.r;}}diff[l]++;diff[r + 1]--;}int ans=0;  //计算答案for(int i=1;i<=n;i++){ans+=diff[i];System.out.print(ans+" ");}}
}class Line implements Comparable<Line>{int l,r;public Line(int l, int r) {this.l = l;this.r = r;}public int compareTo(Line o) {return l-o.l;}
}

题目六:大风起兮【算法赛】

大风起兮【算法赛】 - 蓝桥云课 (lanqiao.cn)

思路:

1.动态求平均数,可以用两个multiset,一个存放一半较小的数,一个存放一半较大的数

2.对于每一个询问,先删除一个数,再计算中位数

AC_Code:C++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>using namespace std;typedef long long LL;
typedef pair<int,int>PII;#define x first
#define y second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()int const mod1=998244353;   
int const mod2=1e9+7;
int const N=2e5+7;
int const INF=0x3f3f3f3f;int T;
int n,m;
int a[N];
string s;void solve(){scanf("%d", &n);vector<int>b;for(int i=1;i<=n;i++)   {scanf("%d",a+i);b.push_back(a[i]);}sort(b.begin(),b.end());multiset<int>mx,mi; //n为奇数,mi多放一个数for(int i=0;i<(n+1)/2;i++)  mi.insert(b[i]);    for(int i=(n+1)/2;i<n;i++)  mx.insert(b[i]);scanf("%d", &m);while(m--){int x;  scanf("%d",&x);if(mi.count(a[x])){ //删除小的数那一堆mi.erase(mi.find(a[x]));if(mx.size()>mi.size()){int temp=*mx.begin();mi.insert(temp);mx.erase(mx.find(temp));}}else{ //删除大的数那一堆mx.erase(mx.find(a[x]));if(mi.size()-mx.size()>1){int temp=*mi.rbegin();mx.insert(temp);mi.erase(mi.find(temp));}}//输出答案if(mi.size()>mx.size()) printf("%.1lf ",*mi.rbegin()*1.0);else printf("%.1lf ",(*mi.rbegin()+*mx.begin())/2.0);}} void init(){                     }int main()
{//std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);T=1;//cin>>T;//scanf("%d",&T);init();while(T--){solve();}return 0;
}

AC_Code:java

题目七:时空追捕【算法赛】

不会写,占时更新,

这篇关于(蓝桥杯)1125 第 4 场算法双周赛题解+AC代码(c++/java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440909

相关文章

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.