【牛客】2024牛客寒假算法基础集训营6ABCDEGHIJ

news2025/1/16 2:30:30

文章目录

  • A 宇宙的终结
    • 题目大意
    • 主要思路
    • 代码
  • B 爱恨的纠葛
    • 题目大意
    • 主要思路
    • 代码
  • C 心绪的解剖
    • 题目大意
    • 主要思路
    • 代码
  • D 友谊的套路
    • 题目大意
    • 主要思路
    • 代码
  • E 未来的预言
    • 题目大意
    • 主要思路
    • 代码
  • G 人生的起落
    • 题目大意
    • 主要思路
    • 代码
  • I 时空的交织
    • 题目大意
    • 主要思路
    • 代码
  • J 绝妙的平衡
    • 题目大意
    • 主要思路
    • 代码

A 宇宙的终结

题目大意

在给定的某个区间内找到一个数,它是3个不同素数的积。

主要思路

这里范围比较小,而且是乘积的形式,如果其中最小的俩个数字分别是2和3,那么第三个数的最大取值也不会超过100/6,所以枚举前面的几个质数,然后暴力查找就可以了。

代码

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

int main()
{
    int l,r;
    int a[]={2,3,5,7,11,13,17,19,21};
    cin>>l>>r;
    for(int i=0;i<8;++i)
        for(int j=i+1;j<8;++j)
            for(int k=j+1;k<8;++k)
            {
                if(l<=a[i]*a[j]*a[k]&&a[i]*a[j]*a[k]<=r)
                {
                    cout<<a[i]*a[j]*a[k];
                    return 0;
                }
            }
    cout<<-1;
    return 0;
}

B 爱恨的纠葛

题目大意

给定俩数组,定义了一个叫做亲密度的东西就是ab俩数组一一对应相减取绝对值的最小值,现在对数组a进行排序,求亲密度最小时的a数组

主要思路

我们只需要找到其中一对就可以了,剩下的随便排都可以,可以把数组a预处理排序,然后对于每一个b数组中的数,在a数组钟进行二分查找最接近的那一个做差,然后记录哪一个是最接近的,最后在a数组中直接调换然后输出即可

代码

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

const int N = 1e5+10;
int a[N],b[N];

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;++i)
        cin>>a[i];
    for(int i=0;i<n;++i)
        cin>>b[i];
    if(n==1)
    {
        cout<<a[0];
        return 0;
    }
    sort(a,a+n);
//     for(int i=0;i<n;++i)
//     {
//         cout<<a[i]<<" ";
//     }
    int minzhi=1e9+10;
    int minweizhi=0,mubiaoweizhi=0;
    for(int i=0;i<n;++i)
    {
        int left=0,right=n-1;
        while(left<right)
        {
            int mid=(left+right)>>1;
            if(a[mid]<b[i])left=mid+1;
            else right=mid;
        }
        int idx=left;
        int cha=INT_MAX;
        if(idx==0)
        {
            if((int)abs(a[0]-b[i])<(int)abs(a[1]-b[i]))
            {
                cha=(int)abs(a[0]-b[i]);
                idx=0;
            }
            else
            {
                cha=(int)abs(a[1]-b[i]);
                idx=1;
            }
        }
        else if(idx==n-1)
        {
            if((int)abs(a[n-1]-b[i])<(int)abs(a[n-2]-b[i]))
            {
                cha=(int)abs(a[n-1]-b[i]);
                idx=n-1;
            }
            else 
            {
                cha=(int)abs(a[n-2]-b[i]);
                idx=n-2;
            }
        }
        else 
        {
            int idx2;
            if((int)abs(b[i]-a[idx-1])<(int)abs(a[idx]-b[i]))
            {
                cha=(int)abs(b[i]-a[idx-1]);
                idx2=idx-1;
            }
            else 
            {
                cha=(int)abs(a[idx]-b[i]);
                idx2=idx;
            }
            if(cha>(int)abs(a[idx+1]-b[i]))
            {
                cha=(int)abs(a[idx+1]-b[i]);
                idx2=idx+1;
            }
            idx=idx2;
        }
        if(cha<minzhi)
        {
            minzhi=cha;
            minweizhi=i;
            mubiaoweizhi=idx;
        }
    }
    swap(a[minweizhi],a[mubiaoweizhi]);
    for(int i=0;i<n;++i)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}

C 心绪的解剖

题目大意

把一个正整数分解成三个斐波那契数的和

主要思路

简单打表看了一下,最多也就是48个数字,直接暴力枚举注意点技巧就行

代码

#include<bits/stdc++.h>
#define debug(x) cout<<#x<<" = "<<x<<"\n"
using namespace std;

long long nums[50]{0,1};
int n=49;

void init()
{
    for(int i=2;i<49;++i)
    {
        nums[i]=nums[i-1]+nums[i-2];
    }
}

void solve()
{
    int target;
    cin>>target;
    // 枚举 a
    for (int i = 0; i < n; ++i) 
    {
        int k = n - 1;
        for (int j = i ; j < n; ++j) 
        {
            while (j <= k && nums[i] + nums[j] + nums[k] > target) 
            {
                --k;
            }
            if (nums[i] + nums[j] + nums[k] == target) 
            {
                cout<<nums[i]<<" "<<nums[j]<<" "<<nums[k]<<"\n";
                return ;
            }
        }
    }
    cout<<"-1\n";
}

int main()
{
    init();
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

D 友谊的套路

题目大意

已知红队每一局获胜的概率为p,请问最终这场对战出现让二追三的概率是多少

主要思路

出现让二追三的局面的时候也就意味着前面四局第一第二输了,第三第四是赢的,后面那一局不用管就好

代码

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

int main()
{
    double p;
    cin>>p;
    printf("%.8lf",pow(p,2)*pow(1-p,2));
    return 0;
}

E 未来的预言

题目大意

根据比赛信息,判断比赛得出胜负的时候,一共进行了多少局。输出比赛的情况

主要思路

一个简单的模拟,遍历字符串累加计数

代码

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

int main()
{
    char x;
    int n;
    cin>>x;
    cin>>x;
    cin>>n;
    string s;
    cin>>s;
    int len=s.size();
    int r=0,p=0;
    for(int i=0;i<len;++i)
    {
        if(s[i]=='R')r++;
        else p++;
        if(r==(n+1)/2)
        {
            cout<<"kou!\n"<<i+1;
            return 0;
        }
        else if(p==(n+1)/2)
        {
            cout<<"yukari!\n"<<i+1;
            return 0;
        }
    }
    cout<<"to be continued.\n"<<len;
    return 0;
}

G 人生的起落

题目大意

形如 ( a , b , a ) , a > b (a,b,a),a>b (a,b,a),a>b的三元组称为“v-三元组”。 构造一个长度为n,和为S,且恰好有k个“v-三元组”的正整数数组。

主要思路

21212121这样够了后面全部放1,然后在考虑剩下数字,如果不够是-1,相同直接输出,如果还有剩余又看看还有没有空位,如果有就把剩下全给最前面(实际上是开头插入,如果给末尾可能刚刚好凑多一个212),没有空位就看看能不能对2集体加1,如果不能就-1,不然就一直+1直到不能操作,然后剩下数字丢给1(思路来自黄大师)

代码

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define pb push_back
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n,s,k;
        cin>>n>>s>>k;
        if(n==1&&k==0)
        {
            cout<<s<<endl;
            continue;
        }
       else if( (n==1&&k!=0)||(n==2&&k!=0) )
       {
           cout<<-1<<endl;
           continue;
       }
       else if(n==2&&k==0)
           {
               cout<<1<<" "<<s-1<<endl;
               continue;
           }
        else if(k==0)
        {
            for(int i=1;i<n;i++) cout << "1" << ' ';
            cout << s-n+1 << endl;
            continue;
        }
       else if(n<2*k+1) {cout<<-1<<endl;continue;}
       else if(k&&s<n+k+1) {cout<<-1<<endl;continue;}
        else 
        {
            ll t=(s-(n-(k+1)))/(k+1);
    vector<ll> ans;
    for(int i=1;i<=k;i++){
        ans.pb(t);
        ans.pb(1);
        s-=t+1;
    }ans.pb(t); s-=t;
    if(ans.size()==n){
        t=s/(n/2);
        for(int i=0;i<=n/2-1;i++){
            ans[i*2+1]+=t;
            s-=t;
        }
        t=0;
        while(s){
            ans[t*2+1]++;
            s--;
            t++;
        }
       if(n>1&&ans[1]==ans[0]) {cout << "-1\n";continue;}
    }
            else{
        t=ans.size();
        while(ans.size()<n){
            ans.pb(1);
            s--;
        }
        ans[t]+=s;
    }
    for(int i=0;i<=n-1;i++) cout << ans[i] << " \n"[i==n-1];
        }
       
    }
	
	return 0;
}

I 时空的交织

题目大意

选择一个子矩形,使得该子矩形所有元素的和尽可能大。

主要思路

假设选定的矩阵区间为 (r_i, r_j) : (c_i, c_j),则子矩阵的和为:
在这里插入图片描述
问题转化为求数组 a 和 b 的一个非空连续子数组和乘积的最大值。

此外,a 数组和 b 数组的元素可以为负数,因此同时求出区间和的最大值和最小值,两两相乘取最大即可。

代码

#include<bits/stdc++.h>
#define debug(x) cout<<#x<<" = "<<x<<"\n"
using namespace std;

const int N = 1e5+10;
long long a[N],b[N];

int main()
{
    int n,m;
    long long maxzhi1=INT_MIN,maxzhi2=INT_MIN;
    cin>>n>>m;
    long long minzhi1=INT_MAX,minzhi2=INT_MAX;
    for(int i=0;i<n;++i)
    {
        cin>>a[i];
    }
    for(int i=0;i<m;++i)
    {
        cin>>b[i];
    }
    long long sum=0;
    long long sum2=0;
    for(int i=0;i<n;++i)
    {
        if(sum+a[i]>0)
        {
            sum+=a[i];
            maxzhi1=max(maxzhi1,sum);
        }
        else 
        {
            sum=0;
            maxzhi1=max(maxzhi1,a[i]);
        }
        //
        if(sum2+a[i]<0)
        {
            sum2+=a[i];
            minzhi1=min(minzhi1,sum2);
        }
        else 
        {
            sum2=0;
            minzhi1=min(minzhi1,a[i]);
        }
    }
///
    sum=0;
    sum2=0;
    for(int i=0;i<m;++i)
    {
        if(sum+b[i]>0)
        {
            sum+=b[i];
            maxzhi2=max(maxzhi2,sum);
        }
        else 
        {
            sum=0;
            maxzhi2=max(maxzhi2,b[i]);
        }
        /
        if(sum2+b[i]<0)
        {
            sum2+=b[i];
            minzhi2=min(minzhi2,sum2);
        }
        else 
        {
            sum2=0;
            minzhi2=min(minzhi2,b[i]);
        }
    }
    long long ans=INT_MIN;
    ans=max(ans,minzhi1*minzhi2);
    ans=max(ans,maxzhi1*maxzhi2);
    ans=max(ans,minzhi1*maxzhi2);
    ans=max(ans,maxzhi1*minzhi2);
    cout<<ans;
    return 0;
}

J 绝妙的平衡

题目大意

给定一棵有根树,若干个节点为红色。 为每个节点赋值1或2,使得每个以红色节点为根的子树,其节点值之和为3的倍数。

主要思路

对于每个红色节点,如果它没有白色子节点,则它的子树除它以外的和已经是的倍数,它为或都不可能再使它的子树和为的倍数。

如果它至少有1个白色子节点,则它和白色子节点可以配合使得它的子树和为的倍数。

因此,按DFS逆序遍历,白色节点先赋值为。若红色节点除其本身外,和不是的倍数,则用它补上;否则将任一白色子节点改为,它赋为。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
vector<int> fa[N];
bool flag=1;
int sum[N];//每个根节点的子树权值之和
int tri[N]; //每个节点的值
char color[N];
int n;
void dfs(int u)
{
    bool st=0;
    if(color[u]=='R') st=1; //如果是红树先假设子树全为红树
    for(auto k:fa[u])  //遍历他的所有子树
    {
        dfs(k);  //搜索他的子树 
        if(color[k]=='W')  // 如果是白色假设条件不成立并且将这棵树的权值加到他的根节点  
        {
            st=0;
            sum[u]+=sum[k];  
        }
    }
    if(st) flag=0; //如果该节点为红色并且该结点的子树全为红色则不满足条件
}
void dfs1(int u)
{
    if(color[u]=='R')
    {
        if(sum[u]%3==1)
        {
            tri[u]=2;
            for(auto k:fa[u])
            {
                if(color[k]!='R')
                {tri[k]=2;break;}
            }
        }
        else if(sum[u]%3==2)
        {
            tri[u]=2;
        }
    }
    for(auto k:fa[u]) dfs1(k);
}
int main()
{
    cin>>n;
    cin>>color+1;
    for(int i=1;i<=n;i++)
    {
        tri[i]=1;
        sum[i]=1;
    }
    int p;
    for(int i=1;i<=n-1;i++)
    {
        cin>>p;
        fa[p].push_back(i+1);
    }
    dfs(1);  //判断是有解并且将每个根节点的权值计算出来
    if(!flag)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    dfs1(1);
    for(int i=1;i<=n;i++)
        cout<<tri[i];
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(三)

在人工智能成为我们日常互动中无处不在的一部分的时代&#xff0c;与大型语言模型(llm)有效沟通的能力是无价的。“良好提示的26条原则”为优化与这些复杂系统的交互提供了全面的指导。本指南证明了人类和人工智能之间的微妙关系&#xff0c;强调清晰、专一和结构化的沟通方法。…

leetcode hot100 买卖股票最佳时机3

本题中&#xff0c;依旧可以采用动态规划来进行解决&#xff0c;之前的两个题我们都是用二维数组dp[i][2]来表示的&#xff0c;其中i表示第i天&#xff0c;2表示长度为2&#xff0c;其中0表示不持有&#xff0c;1表示持有。 本题中&#xff0c;说至多完成两笔交易&#xff0c;也…

RabbitMQ 面试八股题整理

前言&#xff1a;本文是博主网络自行收集的一些RabbitMQ相关八股文&#xff0c;还在准备暑期实习&#xff0c;后续应该会持续更新...... 参考&#xff1a;三天吃透RabbitMQ面试八股文_牛客网 目录 RabbitMQ概述 什么是 RabbitMQ&#xff1f; 说一说RabbitMQ中的AMQP 为什么…

单机取证-信息安全管理与评估-2022年国赛真题-环境+wp

🍬 博主介绍 博主介绍:大家好,我是 Mikey ,很高兴认识大家~ 主攻:【应急响应】 【python】 【数字取证】【单机取证】【流量分析】【MISC】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步 作者水平有限,欢迎各…

网络层的DDoS攻击与应用层的DDoS攻击之间的区别

DDoS攻击&#xff08;即“分布是拒绝服务攻击”&#xff09;&#xff0c;是基于DoS的特殊形式的拒绝服务攻击&#xff0c;是一种分布式、协作的大规模攻击方式&#xff0c;主要瞄准一些企业或政府部门的网站发起攻击。根据攻击原理和方式的区别&#xff0c;可以把DDoS攻击分为两…

(done) 如何判断一个矩阵是否可逆?

参考视频&#xff1a;https://www.bilibili.com/video/BV15H4y1y737/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这个视频里还暗含了一些引理 1.若 AX XB 且 X 和 A,B 同阶可逆&#xff0c;那么 A 和 B 相似。原因&#xff1…

RDMA内核态函数ib_post_recv()源码分析

接上文&#xff0c;上文分析了内核rdma向发送队列添加发送请求的函数ib_post_send&#xff0c;本文分析一下向接收队列添加接收请求的函数ib_post_recv。其实函数调用流程与上文类似&#xff0c;不再重复说明&#xff0c;可参考链接。 函数调用过程 最终会调用到这个函数 下面…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Inpaint)

上篇文章介绍了语义分割Tile/Blur&#xff0c;这篇文章介绍下Inpaint&#xff08;重绘&#xff09; Inpaint类似于图生图的局部重绘&#xff0c;但是Inpain效果要更好一点&#xff0c;和原图融合会更加融洽&#xff0c;下面是案例&#xff0c;可以看下效果&#xff08;左侧原图…

【Java多线程】对线程池的理解并模拟实现线程池

目录 1、池 1.1、线程池 2、ThreadPoolExecutor 线程池类 3、Executors 工厂类 4、模拟实现线程池 1、池 “池”这个概念见到非常多&#xff0c;例如常量池、数据库连接池、线程池、进程池、内存池。 所谓“池”的概念就是&#xff1a;&#xff08;提高效率&#xff09; 1…

pytorch -- ToTensor使用

1. ToTensor定义 导入&#xff1a;from torchvision import transforms 通过transforms.ToTensor解决两个问题&#xff08;PIL image/numpy.ndarray 转化为 tensor &#xff09; ToTensor()返回一个ToTensor的对象(创建具体的工具)&#xff0c;传入pic就会返回一个Tensor类型的…

应急响应实战笔记03权限维持篇(4)

第4篇&#xff1a;Linux权限维持--后门篇 本文将对Linux下常见的权限维持技术进行解析&#xff0c;知己知彼百战不殆。 1、一句话添加用户和密码 添加普通用户&#xff1a; # 创建一个用户名guest&#xff0c;密码123456的普通用户 useradd -p openssl passwd -1 -salt sal…

Spring的另一大的特征:AOP

目录 AOP &#xff08;Aspect Oriented Programming&#xff09;AOP 入门案例&#xff08;注解版&#xff09;AOP 工作流程——代理AOP切入点表达式AOP 通知类型AOP通知获取数据获取切入点方法的参数获取切入点方法返回值获取切入点方法运行异常信息 百度网盘分享链接输入密码数…

[数据集][目标检测]游泳者溺水数据集VOC+YOLO格式2类别895张

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;895 标注数量(xml文件个数)&#xff1a…

第7.1章:StarRocks性能调优——查询分析

目录 一、查看查询计划 1.1 概述 1.2 查询计划树 1.3 查看查询计划的命令 1.3 查看查询计划 二、查看查询Profile 2.1 启用 Query Profile 2.2 获取 Query Profile 2.3 Query Profile结构与详细指标 2.3.1 Query Profile的结构 2.3.2 Query Profile的合并策略 2.…

计算机视觉基础知识(十五)--卷积神经网络

卷积神经网络简介 CNN--卷积神经网络&#xff0c;是一种前馈神经网络&#xff1b;不同于传统的只有线性连接的神经网络&#xff1b;CNN具有卷积&#xff08;convolution&#xff09;操作、池化&#xff08;pooling&#xff09;和非线性激活函数映射等&#xff1b;经典CNN网络有…

【Linux】--- 详解Linux软件包管理器yum和编辑器vim

目录 一、Linux软件包管理器 - yum1.1 yum和软件包是什么1.2 Linux系统(Centos)的生态1.3 yum相关操作1.4 yum本地配置 二、Linux编辑器 - vim使用2.1 vim的基本概念2.2 vim命令模式命令集2.3 vim末行模式命令集2.4 关于vim的几个相关问题 一、Linux软件包管理器 - yum 1.1 yu…

Codeforce Monsters Attack!(B题 前缀和)

题目描述&#xff1a; 思路&#xff1a; 本人第一次的想法是先杀血量低的第二次想法是先搞坐标近的第三次想法看到数据量这么大&#xff0c; 我先加个和看看貌似我先打谁都行&#xff0c;由此综合一下&#xff0c; 我们可以把每一个不同的坐标当作一轮从最小的坐标开始&#x…

Vue+SpringBoot打造在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

机器学习打分函数在分子对接中的应用系列-GB_Score

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、GB-Score是什么&#xff1f;二、文献复现 -训练和验证环境1. GB score验证虚拟环境的配置2. Usage1- Preparing ligand and protein file2- Generating features3 - Repeat and extend current…

打印水仙花数---c语言刷题

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 题述 求出0&#xff5e;100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#…