(蓝桥杯)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

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

不会写,占时更新,

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

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

相关文章

elasticsearch聚合、自动补全、数据同步

目录 一、数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法 1.3 RestAPI实现聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 RestAPI实现自动补全 三、数据同步3.1 思路分析3.1.1 同…

键盘打字盲打练习系列之指法练习——2

一.欢迎来到我的酒馆 盲打&#xff0c;指法练习&#xff01; 目录 一.欢迎来到我的酒馆二.开始练习 二.开始练习 前面一个章节简单地介绍了基准键位、字母键位和数字符号键位指法&#xff0c;在这个章节详细介绍指法。有了前面的章节的基础练习&#xff0c;相信大家对盲打也有了…

java设计模式学习之【适配器模式】

文章目录 引言适配器模式简介定义与用途&#xff1a;实现方式&#xff1a;类型 使用场景优势与劣势适配器模式在Spring中的应用多媒体播放器示例代码地址 引言 在我们的日常生活中&#xff0c;适配器无处不在&#xff1a;无论是将不同国家的插头转换成本地标准&#xff0c;还是…

golang WaitGroup的使用与底层实现

使用的go版本为 go1.21.2 首先我们写一个简单的WaitGroup的使用代码 package mainimport ("fmt""sync" )func main() {var wg sync.WaitGroupwg.Add(1)go func() {defer wg.Done()fmt.Println("xiaochuan")}()wg.Wait() }WaitGroup的基本使用场…

AI 文本转视频(视频生产工具分享)

AI 文本转视频&#xff08;视频生产工具分享&#xff09; 介绍 ​ 想要根据任何描述轻松创建有趣的视频吗&#xff1f;然后&#xff0c;您应该尝试使用人工智能视频生成工具。毫无疑问&#xff0c;人工智能是未来。人工智能视频生成器可以轻松地从任何文本制作视频。只需几分…

(一)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

为何要隐藏IP地址?代理ip在网络安全和隐私保护中的作用是什么?

目录 前言 一、为何要隐藏IP地址&#xff1f; 1. 保护隐私。 2. 防止网络攻击。 3. 避免限制和审查。 二、网络上哪些行为需要隐藏IP和更换IP&#xff1f; 1. 下载种子文件。 2. 访问受限网站。 3. 保护网络隐私。 4. 避免被封禁。 三、代理IP在网络安全和隐私保护中…

数据结构-04-队列

1-队列的结构和特点 生活中我们排队买票&#xff0c;先来的先买&#xff0c;后来的人只能站末尾&#xff0c;不允许插队。先进者先出&#xff0c;这就是典型的"队列"。队列跟栈非常相似&#xff0c;支持的操作也很有限&#xff0c;最基本的操作也是两个&#xff1a;入…

Paraformer 语音识别原理

Paraformer(Parallel Transformer)非自回归端到端语音系统需要解决两个问题&#xff1a; 准确预测输出序列长度&#xff0c;送入预测语音信号判断包含多少文字。 如何从encoder 的输出中提取隐层表征&#xff0c;作为decoder的输入。 采用一个预测器&#xff08;Predictor&…

windows配置go调用python的编译环境

go是支持调用python代码的&#xff0c;之前写了几篇linux的部署教程&#xff0c;因为觉得windows的不复杂就没有写&#xff0c;结果今天新部署一个Windows的环境&#xff0c;有些步骤想不起来了&#xff0c;好记性不如烂笔头&#xff0c;还是记录一下吧。 这些是之前写的linux…

Vue3Element-plus编写一个简版的字典服务

之前公司有维护过一个内部的字典平台,基本步骤和页面如下 添加字典属性弹窗 添加枚举值弹窗 基本业务代码如下 核心代码 import { defineStore } from pinia export const useDictionary defineStore(dictionary, {state: () > ({dict: [],dictObj: {},}),actions: {s…

C语言-指针讲解(4)

在上一篇博客中&#xff1a; C语言-指针讲解(3) 我们给大家介绍了指针进阶的用法 让下面我们来回顾一下讲了什么吧&#xff1a; 1.字符指针变量类型以及用法 2.数组指针本质上是一个指针&#xff0c;里面存放数组的地址。而指针数组本质上是个数组&#xff0c;里面存放的是指针…

知识图谱最简单的demo实现

一、简介 知识图谱整个建立过程可以分为以下几点&#xff1a; #mermaid-svg-zJuLB8k8EgBQF8M0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zJuLB8k8EgBQF8M0 .error-icon{fill:#552222;}#mermaid-svg-zJuLB8k8E…

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…

Kubernetes(K8s) Pod详解-05

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少 Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为依据…

hadoop完全分布式搭建

文章目录 集群部署规划服务器准备Mobaxterm 远程登录实验前准备安装软件工具关闭防火墙 安装 JDK 和 Hadoop创建软件包目录解压软件包配置环境变量 集群搭建先创建 HDFS 工作目录和 LOG 目录配置集群配置环境配置 HDFS 主节点信息、持久化和数据文件的主目录配置 HDFS 默认的数…

程序员养生之道:延寿不忘初心——延寿必备

文章目录 每日一句正能量前言如何养生饮食篇运动篇休息篇后记 每日一句正能量 现代社会已不是大鱼吃小鱼的年代&#xff0c;而是快鱼吃慢鱼的年代。 前言 在IT行业中&#xff0c;程序员是一个重要的职业群体。由于长时间的繁重编程工作&#xff0c;程序员们常常忽略了身体健康…

Unity中Shader编译目标渲染器

文章目录 前言一、Unity在打包时&#xff0c;会把Shader编译成不同平台对应的代码我们在状态栏&#xff0c;可以看见我们目前所处于的目标平台 二、在Unity中&#xff0c;怎么指定目标平台1、#pragma only_renderers2、#pragma exclude_renderers 三、我们测试一下看看效果1、 …

postman利用pre-request script自动设置token

场景&#xff1a; 我们请求接口&#xff1a;/api/rest/user/list获取用户列表&#xff0c;但是该接口需要在header中带上Authorization表示的鉴权Token才行。 而登录接口/api/rest/login&#xff0c;则可以返回改Token 常规方案 我们先调登录接口/api/rest/login获取到Toke…

极简云网络验证系统开源源码

极简云验证&#xff0c;多样化应用管理方式&#xff0c;多种项目任你开发&#xff0c;分布式应用开关&#xff0c;让您的应用开发更简单&#xff0c;完美实现多用户多应用管理。 支持多应用卡密生成&#xff1a; 卡密生成 单码卡密 次数卡密 会员卡密 积分卡密 卡密管理 卡密长…