2024牛客寒假算法基础集训营1

文章目录

    • A DFS搜索
    • M牛客老粉才知道的秘密
    • G why外卖
    • E 本题又主要考察了贪心
    • B 关鸡
    • C 按闹分配

今天的牛客,说是都是基础题,头昏昏的,感觉真不会写,只能赛后补题了

A DFS搜索

写的时候刚开始以为还是比较难的,和dfs有关,读完题目发现就是一个序列中含有dfs,而且字符串的长度小于等于五十,可以直接三层暴力搜索即可。

需要注意要考虑长度小于3的情况,刚开始没有考虑到,如果小于3,肯定是不符合的。
AC代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int n;
  cin >> n;
  string s1 = "DFS";
  string s2 = "dfs";

  while (n--)
  {
    bool flag1 = false;
    bool flag2 = false;
    int t;
    string s;
    cin >> t >> s;
    if (s.length() < 3)
    {
      cout << "0"
           << " "
           << "0" << endl;
      continue;
    }
    for (int i = 0; i < s.length() - 2; i++)
    {

      if (s[i] == 'D')
      {
        for (int j = i + 1; j < s.length() - 1; j++)
        {
          if (s[j] == 'F')
          {
            for (int k = j + 1; k < s.length(); k++)
            {
              if (s[k] == 'S')
              {
                // 满足条件的
                flag1 = true;
              }
            }
          }
        }
      }
    }

    for (int i = 0; i < s.length() - 2; i++)
    {
      char c = s[i];
      if (s[i] == 'd')
      {
        for (int j = i + 1; j < s.length() - 1; j++)
        {
          if (s[j] == 'f')
          {
            for (int k = j + 1; k < s.length(); k++)
            {
              if (s[k] == 's')
              {
                // 满足条件的
                flag2 = true;
              }
            }
          }
        }
      }
    }
    if (flag1 == true)
    {
      cout << "1"
           << " ";
    }
    else
    {
      cout << "0"
           << " ";
    }
    if (flag2 == true)
    {
      cout << "1" << endl;
    }
    else
    {
      cout << "0" << endl;
    }
  }
}

M牛客老粉才知道的秘密

image.png
这道题目其实可以看做是数论和找规律的题目,属于div4了。

每次只能显示6道题目,刚开始去模拟了一遍,超时间复杂度了,需要的是O(1);

可以这样想着,如果为6的整数,那么最左侧一道的可能性,往后移动应该是n/6,并且向右和向左是相同的位置

如果不是6的整数呢?先移动n/6次,再+一次移动到了最右边。此时为n/6+1;
从最右边往左开始移动,可以发现,最左边的位置和向右移动只可能在1的时候会有重复,其他是不可能重复的,因为刚才发生移位了。
所以数量为n/6-1 。综上就是n/6*2;

AC代码


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int t=scanner.nextInt();
        while (t-->0){
            int sum=0;
            int n=scanner.nextInt();
            int k=n%6;
            if (k!=0){
                //简单的逻辑思维题目
                int m=n/6;
                sum+=m+m;
            }else{
                sum+=n/6;
            }
            System.out.println(sum);
        }
    }
}

G why外卖

这也是一道模拟题目,感觉是基本的高中数学题目,要想明白他们之间的关系,我感觉就可以了
image.png
可以使用优惠卷,但是购买物品的价格必须大于所用的优惠卷,我刚开始在想如果花费价格小于优惠卷如何解决?
其实这个问题是可以不同解决的。
image.png
sum是可以减去的钱,sum+m可以你可以购买最大商品的价值,如果sum+m大于了当前的优惠卷,就可以ans就等于n+sum;
但是如果现在是100 80 只有10块钱,那么不符合要求,为什么sum还要加上八十呢?
这个80现在其实只是加在了sum里面,并没有加到ans里面。因为数组是升序的,也就是后面如果大于了,说明前面一定也是大于的。就可以加进来。

package 牛客寒假训练营.第一场.G;

import java.util.Arrays;
import java.util.Scanner;

class Money implements Comparable<Money> {
    long a;
long b;

public Money(long a, long b) {
    this.a = a;
    this.b = b;
}

@Override
public int compareTo(Money other) {
    return Long.compare(this.a, other.a);
}
}

public class Main {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    int t = scanner.nextInt();
    while (t-- > 0) {
        solve(scanner);
    }
}

static void solve(Scanner scanner) {
    int n = scanner.nextInt();
    long m = scanner.nextLong();
    Money[] c = new Money[100005];
    long ans = m;
    long sum = 0;

    for (int i = 1; i <= n; i++) {
        long a = scanner.nextLong();
        long b = scanner.nextLong();
        c[i] = new Money(a, b);
    }

    Arrays.sort(c, 1, n + 1); //排序,出来的按照优惠的价格进行排序

    for (int i = 1; i <= n; i++) {
        sum += c[i].b;//优惠的价格
        if (sum + m >= c[i].a) {
            ans = m + sum;
        }
    }
    System.out.println(ans);
}
}

E 本题又主要考察了贪心

不能被题目的名称所迷惑,说是贪心考点,其实并不是贪心。

这道题在考场如何去做呢?先看数据范围。
image.png
每次比赛都有三种对应的可能,m<=10,说明最多有十场比赛,也就是3的10次方,这个时间复杂度是可以接收的,可以想到用dfs去解决。

#include <bits/stdc++.h>
using namespace std;
int n, m;
int x[101], y[101];
int ans, a[101];

// u是对应的场数 当u>m表示比赛已经结束的时候
void dfs(int u)
{
    if (u > m)
    {
        int rank = 1;
        for (int i = 2; i <= n; i++)
            {
                if (a[1] < a[i])
                    rank++;
            }
        ans = min(ans, rank);
        return;
    }
    a[x[u]] += 3;
    dfs(u + 1);
    a[x[u]] -= 3;

    a[y[u]] += 3;
    dfs(u + 1);
    a[y[u]] -= 3;

    a[x[u]]++;
    a[y[u]]++;
    dfs(u + 1);
    a[x[u]]--;
    a[y[u]]--;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
        {
            cin >> n >> m;
            ans = n;
            for (int i = 1; i <= n; i++)
                {
                    cin >> a[i];
                }
            for (int i = 1; i <= m; i++)
                {
                    cin >> x[i] >> y[i];
                }
            dfs(1);
            cout << ans << endl;
        }
}

其实就是可以看作为一个三叉树来看,每一次都是有A赢或者B赢或者AB平局,走遍每一个路径,需要找到最好的排名。时间复杂度 o(n*3^m);
用a数组来存左边操作的玩家,用b数组来存储右边操作的玩家。
dfs结束的条件,就是u>m表示游戏轮数结束了

B 关鸡

如何将这个鸡关在里面呢?
image.png
想要这个鸡不跑出去有两个情况,第一个是需要四个点,各方在两边即可。第二个是三个火点直接将g包围即可。
所以刚开始让ans1=4,ans2=3 看两个哪个小,ans2需要全部包围只能由一种情况,就是刚开始是包围的。并且如果n==0,一定是最小需要三个,直接包围起来。

#include <bits/stdc++.h>
#define int long long
#define pii pair<double,double>
using namespace std;
const int N=2e5+5;
int t,n,m,k;
int x,y,a[N],b[N];
signed main() {
    cin>>t; // 输入测试用例数量
    while(t--) {
        cin>>n; // 输入点的数量
        if(n==0) { // 如果点的数量为0
            cout<<3<<endl; // 输出3
            continue;
        }
        map<int,int> ma1,ma2; // 定义两个map,用于统计x=1和x=2的y的出现次数
        int ans1=4,ans2=3; // 初始化两个答案,分别对应x=1和x=2的情况
        bool ll=0,rr=0; // 判断左右区间是否有点
        for(int i=0;i<n;i++) {
            cin>>x>>y; // 输入x和y
            if(x==1&&y==1) ans2--; // 如果x=1,y=1,ans2减1
            if(x==1&&y==-1) ans2--; // 如果x=1,y=-1,ans2减1
            if(x==2&&y==0) ans2--; // 如果x=2,y=0,ans2减1

            if(y<=0) ll=1; // 如果y<=0,左区间有点
            if(y>=0) rr=1; // 如果y>=0,右区间有点
            if(x==1) {
                ma1[y]++; // 统计x=1的y出现的次数
            }
            if(x==2) {
                ma2[y]++; // 统计x=2的y出现的次数
            }
        }
        if(ll) ans1--; // 如果左区间有点,ans1减1   左边有端点
        if(rr) ans1--; // 如果右区间有点,ans1减1   右边有端点

        bool l=0,r=0; // 判断左右区间是否有点
        for(auto it:ma1) {
            int p=it.first; // 获取y的值
            if(p<0) {
                //存在一个点周围有其他点,那边这里肯定是出不去的 下面ans还需要--;
                if(ma2[p-1]||ma2[p]||ma2[p+1]) l=1; // 如果左区间存在点,l置为1
            }
            if(p>0) {
                if(ma2[p-1]||ma2[p]||ma2[p+1]) r=1; // 如果右区间存在点,r置为1
            }
        }
        if(l) ans1--; // 如果左区间有点,ans1减1
        if(r) ans1--; // 如果右区间有点,ans1减1
        cout<<min(ans1,ans2)<<endl; // 输出两个答案中的较小值
    }
    return 0;
}
//3 2 1 5 4
//3 4 5 1 2
/*
  abcabcabc
  
 */  

这里用到了map来存储对应的地图值,暴力遍历的。

C 按闹分配


##image.png
image.png
image.png
增加的不满意度就是 tc*排在鸡后面的人数,给定了最大不满意度,所以可以算出来最多人数为m/tc。向下进行取整
此时再将排在鸡前面的时间加起来再加上鸡需要的时间,就是最早的时间了。
AC代码

#include<bits/stdc++.h>

#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

using namespace std;

const int N = 1e5+10;

int t[N],s[N];
int tt[N],ss[N];

signed main(){
	IOS;
	int n,q,tc;
    cin >> n >> q >> tc;
    for(int i=1;i<=n;i++){
        cin >> t[i];
    }
    sort(t+1,t+1+n);
    for(int i=1;i<=q;i++){
        int m;
        cin >> m;
        int ans=0;
        int w=m/tc;
        for(int i=1;i<=n-w;i++) ans+=t[i];
        cout << ans+tc << '\n';
    }
	return 0;
}

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

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

相关文章

老版本labelme如何不保存imagedata

我的版本是3.16&#xff0c;默认英文且不带取消保存imagedata的选项。 最简单粗暴的方法就是在json文件保存时把传递过来的imagedata数据设定为None&#xff0c;方法如下&#xff1a; 找到labelme的源文件&#xff0c;例如&#xff1a;D:\conda\envs\deeplab\Lib\site-packages…

数据分析基础之《pandas(4)—pandas画图》

1、DataFrame.plot(xNone, yNone, kindline) 说明&#xff1a; x&#xff1a;设置x轴标签 y&#xff1a;设置y轴标签 kind&#xff1a; line 折线图 bar 柱状图 hist 直方图 pie 饼图 scatter 散点图 # 找到p_change和turnover之间的关系 data.plot(xvolume, yturnover, kinds…

dubbo+sentinel最简集成实例

说明 在集成seata后&#xff0c;下面来集成sentinel进行服务链路追踪管理&#xff5e; 背景 sample-front网关服务已配置好 集成 一、启动sentinel.jar 1、官网下载 选择1:在本地启动 nohup java -Dserver.port8082 -Dcsp.sentinel.dashboard.serverlocalhost:8082 -Dp…

Simulink|光伏阵列模拟多类故障(开路/短路/阴影遮挡/老化)

目录 主要内容 模型研究 1.正常模型 2.断路故障 3.短路故障 4.阴影遮挡 5.老化模型 结果一览 1.U-I曲线 2.P-V曲线 下载链接 主要内容 该模型为光伏阵列模拟故障情况simulink模型&#xff0c;程序实现了多种故障方式下的光伏阵列输出功率-电压-电流关系特…

链表——C语言——day17

链表 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。在用数组存放数据时&#xff0c;必须事先定义固定的长度&#xff08;即元素个数&#xff09;。链表则没有这种缺点&#xff0c;它根据需要开辟内存单元。 链表有一个“头指针“变量&#xff0c;图中…

Docker极速入门掌握基本概念和用法

1、Docker概念 1.1什么是docker Docker是一个快速交付应用、运行应用的技术&#xff0c;具备以下优势 可将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通…

jmeter-03界面介绍

文章目录 主界面介绍测试计划介绍线程组介绍线程组——选择测试计划&#xff0c;右键-->添加-->线程-->线程组 主界面介绍 测试计划介绍 测试计划&#xff1a;本次测试所需要的所有内容&#xff0c;即父线程 线程组介绍 jmeter讲究一个概念&#xff1a;一个线程一…

如何在docker中访问电脑上的GPU?如何在docker中使用GPU进行模型训练或者加载调用?

如何在docker中访问电脑上的GPU&#xff1f;如何在docker中使用GPU进行模型训练或者加载调用&#xff1f; 其实使用非常简单&#xff0c;只是一行命令的事&#xff0c;最主要的事配置好驱动和权限。 docker run -it --rm --gpus all ycj520/centos:1.0.0 nvidia-smi先看看 st…

AI在线写作软件推荐:5款不可错过的写作工具

现在人工智能&#xff08;AI&#xff09;技术已经渗透到了各个领域&#xff0c;包括写作。AI在线写作软件的出现&#xff0c;为我们提供了更加高效、准确的写作工具。在本文中&#xff0c;我将向大家推荐5款功能强大的AI在线写作软件&#xff0c;这些软件可以帮助我们提高写作效…

一文掌握SpringBoot注解之@Configuration知识文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

QEMU源码全解析 —— 内存虚拟化(2)

接前一篇文章&#xff1a; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 QEMU内存管理模型 特此致谢&#xff01; QEMU内存初始化 1. 基本结构 在开始介绍内存初始化…

对象克隆Objects

对象克隆 把A对象的属性值完全拷贝给B对象&#xff0c;也叫对象拷贝&#xff0c;对象复制。 package MyApi.a04objectdemo;public class ObjectDemo03 {public static void main(String[] args) throws CloneNotSupportedException {//1.先创建一个对象int []data{1,2,3,4,5,…

深度学习(12)--Mnist分类任务

一.Mnist分类任务流程详解 1.1.引入数据集 Mnist数据集是官方的数据集&#xff0c;比较特殊&#xff0c;可以直接通过%matplotlib inline自动下载&#xff0c;博主此处已经完成下载&#xff0c;从本地文件中引入数据集。 设置数据路径 from pathlib import Path# 设置数据路…

C# Onnx GroundingDINO 开放世界目标检测

目录 介绍 效果 模型信息 项目 代码 下载 介绍 地址&#xff1a;https://github.com/IDEA-Research/GroundingDINO Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection" 效果 …

RT-Thread 28. Nano实现MSH及CPU利用率显示

Nano版源码官网下载 https://github.com/RT-Thread/rtthread-nano/archive/refs/heads/master.zip 1. 代码结构 2.代码 //main.c #include "gd32f3x0.h" #include <rthw.h> #include <rtthread.h> #include "cpuusage.h"#define delay_ms(x…

树型结构构建,模糊查询,过滤

一、前言 1、最近在做甘特图&#xff0c;有些需求和树型结构要求很大&#xff0c;看的是 pingCode&#xff0c;有搜索 2、还有抽取一部分树型结构的&#xff0c;如下是抽取上面的结构类型为需求的&#xff0c;重新组成树型 二、构建多颗树型结构 1、某些业务下&#xff0c;从…

【Nginx】Ubuntu如何安装使用Nginx反向代理?

文章目录 使用Nginx反向代理2个web接口服务步骤 1&#xff1a;安装 Nginx步骤 2&#xff1a;启动 Nginx 服务步骤 3&#xff1a;配置 Nginx步骤 4&#xff1a;启用配置步骤 5&#xff1a;检查配置步骤 6&#xff1a;重启 Nginx步骤 7&#xff1a;访问网站 proxy_set_header 含义…

vue-3d-model

vue-3d-model - npm GitHub - hujiulong/vue-3d-model: &#x1f4f7; vue.js 3D model viewer component 通过该插件降低Threejs的使用难度 vue项目加载三维模型&#xff0c;我把模型放在了服务器的tomcat里面&#xff0c;需要对tomcat的fbx项目文件夹设置跨域&#xff0c;如…

同城外卖跑腿app开发:重新定义城市生活

随着科技的发展和人们生活节奏的加快&#xff0c;同城外卖跑腿app应运而生&#xff0c;成为现代城市生活中的重要组成部分。本文将探讨同城外卖跑腿app开发的意义、市场需求、功能特点以及未来的发展趋势。 一、同城外卖跑腿app开发的意义 同城外卖跑腿app作为一种便捷的生活…

如何看待“Linux 中国” 开源社区,停止运营?

如何看待“Linux 中国” 开源社区&#xff0c;停止运营&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家…
最新文章