牛客小白月赛96

news2024/10/1 21:31:49

牛客小白月赛96

A 最少胜利题数

链接:https://ac.nowcoder.com/acm/contest/84528/A
来源:牛客网

题目描述

本场小白月赛共 6 题,𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔和𝐾𝑒𝑑𝑢𝑜𝑙𝑖打算𝑝𝑘一下,他们规定解题数目较多的一方获胜。
规定一个解题序列为长度不超过 6 且只包含𝐴、𝐵、𝐶、𝐷、𝐸、𝐹这6种字符的字符串,一个人不会重复解同一道题。
𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔的解题序列为 𝑆1 ,𝐾𝑒𝑑𝑢𝑜𝑙𝑖的解题序列为 𝑆2 ,保证两个人的解题数目不同。

请你帮助他们计算出失败的一方若要反超胜利的一方还需要解出的题数,若不可能战胜,则输出 −1。

输入描述:

输入共两行,包含两个字符串 𝑆1 和 𝑆2(1≤∣𝑆1∣,∣𝑆2∣≤6)。
数据保证只包含𝐴、𝐵、𝐶、𝐷、𝐸、𝐹这6种字符,保证一个人不重复解题。

输出描述:

一个整数,表示失败的一方若要反超胜利的一方还需要解出的题数或 −1。

示例1

输入
ABD
ABCD
输出
2

示例2

输入
ABCDEF
ACE
输出
-1

题解

分类讨论下好了

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

int main(){
    string s1, s2;
    cin >> s1 >> s2;
    int l1 = s1.size(), l2 = s2.size();
    if(max(l1,l2)==6){
        cout << -1 << '\n';
    }
    else
        cout << abs(l1 - l2) + 1 << '\n';
    return 0;
}
B 最少操作次数

链接:https://ac.nowcoder.com/acm/contest/84528/B
来源:牛客网

题目描述

𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔有一个长度为𝑛的字符串𝑆,仅包含0和1两种字符。
𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔每次可以选择两个索引𝑖和𝑗(1≤𝑖<𝑗≤𝑛),并满足以下条件之一:
1.如果区间 [𝑖,𝑗] 中 1 的数量大于 0 的数量,可以把此区间的所有数字都变成 1。
2.如果区间 [𝑖,𝑗] 中 0 的数量大于 1 的数量,可以把此区间的所有数字都变成 0。
他想知道把整个串变成全 0 或者全 1 的最少操作次数,如果无解,输出−1。

输入描述:

第一行一个整数 𝑛(1≤𝑛≤2×105) ,表示字符串长度。
第二行一个长度为 𝑛 字符串𝑆,保证输入只含 0、1。

输出描述:

一个整数,表示最少操作次数,无解输出 −1。

示例1

输入
2
01
输出
-1

示例2

输入
3
011
输出
1

题解

看题目感觉挺唬人的,让人感觉是一道DP的题目
但是你只要稍微分析下,你会发现这道题跟数列的顺序没有任何的关系,之和0和1的个数有关,也是一道分类讨论的题目

#include <bits/stdc++.h>
using namespace std;
int n,cnt0,cnt1;
string s;

signed main()
{
	int i,j,k;
    cin>>n>>s;
    for (i=0;i<n;i++) {
        if (s[i] == '0')cnt0++;
        else cnt1++;
    }
    if (cnt0 == 0 || cnt1 == 0) {
        cout << 0 << endl;
        return 0;
    }
    if (cnt0 != cnt1) {
        cout << 1 << endl;
        return 0;
    }
    if (s.size() == 2) cout << -1 << endl;
    else cout << 2 << endl;
	return 0;
}
C 最多数组数量

链接:https://ac.nowcoder.com/acm/contest/84528/C
来源:牛客网

题目描述

一个山峰数组定义为由三个元素组成 [𝑎1,𝑎2,𝑎3],满足 𝑎1<𝑎2 且 𝑎2>𝑎3
𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔有一个长度为 𝑛 的数组 𝑃,他将选择两个索引 𝑖,𝑗(1≤𝑖<𝑗<𝑛),然后分成三个非空连续的子数组,即 b 1 = ∑ k = 1 k = i P k , b 2 = ∑ k = i + 1 k = j P k , b 3 = ∑ k = j + 1 k = n P k b_{1}=\sum_{k=1}^{k=i} P_{k}, b_{2}=\sum_{k=i+1}^{k=j} P_{k}, b_{3}=\sum_{k=j+1}^{k=n} P_{k} b1=k=1k=iPk,b2=k=i+1k=jPk,b3=k=j+1k=nPk ,满足[𝑏1,𝑏2,𝑏3]是一个山峰数组。
𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔想知道共有多少个不同的 (𝑖,𝑗) 可以满足条件,请你帮助他计算一下。

输入描述:

第一行一个整数 𝑛(3≤𝑛≤2×105 ),表示数组 𝑃 的长度。
第二行 𝑛 个整数,第 𝑖 个数为 𝑃𝑖(1≤𝑃𝑖≤106),表示数组元素。

输出描述:

一个整数,表示可以得到的山峰数组个数。

示例1

输入
5
1 2 3 4 5
输出
2

题解

题目看起来挺难,数据范围摆在哪里,你不可能两层循环的,对吧
那就思考怎么简便运算
首先你需要找到一个求和数组,因为Pi是正数,所以前缀和数组一定的递增的,然后你选择i然后二分的寻找符合条件的j,这样的时间复杂度可以n2变成nlogn ,可以通过此题
然后看网上还有种解法是双指针,就是一开始找到i=1满足的j的节点,然后i向后移动同时调整j的位置,这个似乎的O(n)算法吧,应该更加优秀

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int MAX=200005;
int n,a[MAX],sum[MAX];
bool check(int mid,int pre){
    if(sum[mid] - sum[pre] <= sum[pre] || sum[mid] - sum[pre] <= sum[n]-sum[mid])return false;
    return true;
}
signed main(){
    int i,j,k;
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>a[i];
        sum[i]=a[i]+sum[i-1];
    }
    
    int ans = 0,now = 0;
    for(i=1;i<=n;i++){
        now += a[i];
        int l=i,r=n;
        while(l+1<r){
            int mid = (l+r)>>1;
            if(check(mid,i))r = mid;
            else l = mid;
        }
        ans += n-r;
    }
    cout<<ans;
    return 0;
}

D 最小连通代价

链接:https://ac.nowcoder.com/acm/contest/84528/D
来源:牛客网

题目描述

𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔有 𝑛 个结点,第 𝑖 个结点的权值为 𝐴𝑖 。
初始时都为孤立的点,互不连通。
现在需要加若干条无向边,使得所有点构成一张无向连通图。
我们定义在两个结点之间加边的代价为:如果两个点的权值都是偶数或者都是奇数,代价为
𝑎。否则为 𝑏。
现在你需要帮助𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔算出所有点构成一张无向连通图的最小代价之和。
注:加边过程中不能有重边和自环。

输入描述:

第一行一个整数 𝑇(1≤𝑇≤1000) ,表示输入的数据组数。
对于每组数据的格式为:
第一行三个整数 𝑛(1≤𝑛≤2×105),𝑎,𝑏(−100≤𝑎,𝑏≤100),表示结点个数和连通结点的不同代价。
第二行 𝑛 个整数,第 𝑖 个数 𝐴𝑖(0≤𝐴𝑖≤106) 表示第 𝑖 个结点的权值。
对于单组数据保证 ∑𝑛≤2×105

输出描述:

共 𝑇 行,每行 一个整数,表示所有点构成一张无向连通图的最小代价之和。

示例1

输入
2
5 1 2
0 1 2 3 4
5 100 0
1 2 3 4 5
输出
5
0

说明

对于第二组样例加边后的连通图为:在这里插入图片描述

题解

有点麻烦,因为你的a和b可以是负数,所以需要多讨论讨论
说真的,一开始我以为是最小生成树,但是后来想着想着就不对劲了
这道题其实也是分类讨论的题目,讨论a,b的正负性,然后就欧了
看代码吧

#include<bits/stdc++.h>
using namespace std;
#define int long long
int T,n,a,b,s[200005],x[200005];
int find(int i)
{
    if(x[i]==i)return x[i];
    return x[i]=find(x[i]);
}
signed main()
{
    int i,j,k;
    cin>>T;
    while(T--)
    {
       //看a还是b小
       //a小 odd odd    even even
       //b add even 先连 然后看有几个去块
        cin>>n>>a>>b;
        for(i=1;i<=n;i++)
            cin>>s[i];       //连通图是任意两点可以到达
        int l=0,r=0; 
        for(i=1;i<=n;i++)
        {
           if(s[i]%2==0)l++;
           else r++;
        }
        int ans=1e9; //a为负数
        if(r==0||l==0) ans=min((n-1)*a,(n*(n-1)/2)*a);
        else
        {
            if(a<=0&&b<=0)
                ans=l*(l-1)/2*a+r*(r-1)/2*a+l*r*b;
            else if(a<=0)
                ans=l*(l-1)/2*a+(r-1)*r/2*a+b;
            else if(b<=0)ans=l*r*b;
            else  ans=min((r-1)*a+(l-1)*a+b,(n-1)*b);
        }
        cout<<ans<<endl;
    }
    return 0;
}
E 最大稳定数值

链接:https://ac.nowcoder.com/acm/contest/84528/E
来源:牛客网

题目描述

𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔有一棵结点总数为 𝑛 且根节点编号为 1 的有根树,第 𝑖 个结点的权值为 𝑎𝑖
一个结点称为"支撑结点"当且仅当其满足以下所有条件:
上层结点:除自身结点以外的祖先节点。
下层结点:除自身结点以外的子孙节点。
1.该结点的所有上层结点权值之和大于等于当前结点的权值(如果无上层结点,则其权值之和为0)。
2.该结点的所有下层结点权值之和小于等于当前结点的权值(如果无下层结点,则其权值之和为0)。
一棵有根树的稳定值为该有根树"支撑结点"的个数,为了让这棵树的稳定值达到最大,𝐵𝑖𝑛𝑔𝑏𝑜𝑛𝑔得到了一次删除树边的机会(可以不删除),即选择两个结点 𝑢,𝑣 是 𝑣 的父节点),然后把连接 𝑢,𝑣 的边删除,即把以 𝑣 为根的子树删除。请你帮助他计算出该有根树可能达到的最大稳定值。
注:当选择删除子树时,该子树的支撑结点不计入答案。

请回忆:

  • 祖先结点:沿树根到某一结点路径上的所有结点都是这个结点的祖先结点;
  • 子孙结点:某一结点的子树中的所有结点是这个结点的子孙;
输入描述:

第一行一个整数 𝑛(1≤𝑛≤105),表示该有根树的结点个数。
第二行包含 𝑛 个整数,第 𝑖 个数为 𝑎𝑖(1≤𝑎𝑖≤109),表示第 𝑖 个结点的权值。
第三行包含 𝑛 个整数,第 𝑖 个数为 𝑓𝑎𝑡ℎ𝑒𝑟𝑖(1≤𝑓𝑎𝑡ℎ𝑒𝑟𝑖≤𝑖−1),表示第 𝑖 个结点的父亲结点的编号,特别地 𝑓𝑎𝑡ℎ𝑒𝑟1=0。

输出描述:

一个整数,表示该有根树可能达到的最大稳定值。

示例1

输入
5
10 2 3 1 2
0 1 1 2 3
输出
4

示例2

输入
6
10 10 3 10 7 40
0 1 1 2 3 4
输出
3

备注:

对于样例一:无需删边。
对于样例二:删除结点4和结点6的边即可。
在这里插入图片描述

`
import java.io.BufferedInputStream;
import java.util.*;

public class Main {

static class BIT {
    int n;
    int[] arr;
    public BIT(int n) {
        this.n = n;
        this.arr = new int[n + 1];
    }
    int query(int p) {
        int res = 0;
        while (p > 0) {
            res += arr[p];
            p -= p & -p;
        }
        return res;
    }
    void update(int p, int d) {
        while (p <= n) {
            this.arr[p] += d;
            p += p & -p;
        }
    }
}

static
public class Solution {
    int n;
    int[] arr;
    List<Integer>[]g;

    long[] up;
    long[] down;

    int[] cs;

    Map<Long, Integer> idMap = new HashMap<>();
    BIT bit;

    public int solve(int n, int[] arr, int[] pa) {
        this.n = n;
        this.arr = arr;

        this.up = new long[n];
        this.down = new long[n];
        this.cs = new int[n];

        this.g = new List[n];
        Arrays.setAll(g, x->new ArrayList<>());
        for (int i = 0; i < n; i++) {
            if (pa[i] != -1) {
                g[pa[i]].add(i);
            }
        }
        dfs(0, -1, 0);

        TreeSet<Long> ids = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            if (up[i] - arr[i] >= arr[i] && down[i] - arr[i] > arr[i]) {
                ids.add(down[i] - 2l * arr[i]);
            }
            ids.add(down[i]);
        }
        int ptr = 1;
        for (long k: ids) {
            idMap.put(k, ptr++);
        }
        this.bit = new BIT(ids.size());

        dfs3(0, -1);
        return gAns + cs[0];
    }

    int gAns = 0;

    void dfs3(int u, int fa) {
        int idx = idMap.get(down[u]);
        int r = bit.query(idx);
        r -= cs[u];
        if (r > gAns) {
            gAns = r;
        }

        if (up[u] - arr[u] >= arr[u] && down[u] - arr[u] > arr[u]) {
            bit.update(idMap.get(down[u] - arr[u] * 2l), 1);
        }

        for (int v: g[u]) {
            if (v == fa) continue;
            dfs3(v, u);
        }
        if (up[u] - arr[u] >= arr[u] && down[u] - arr[u] > arr[u]) {
            bit.update(idMap.get(down[u] - arr[u] * 2l), -1);
        }
    }

    void dfs(int u, int fa, long pre) {
        up[u] = pre + arr[u];
        down[u] += arr[u];
        for (int v: g[u]) {
            if (v == fa) continue;
            dfs(v, u, up[u]);
            down[u] += down[v];
            cs[u] += cs[v];
        }
        if (up[u] - arr[u] >= arr[u] && down[u] - arr[u] <= arr[u]) {
            cs[u] += 1;
        }
    }
}

public static void main(String[] args) {
    Scanner sc = new Scanner(new BufferedInputStream(System.in));
    int n = sc.nextInt();
    int[] arr = new int[n];
    for (int i = 0; i < n; i++) {
        arr[i] = sc.nextInt();
    }
    int[] pa = new int[n];
    for (int i = 0; i < n; i++) {
        pa[i] = sc.nextInt() - 1;
    }
    Solution solution =new Solution();
    System.out.println(solution.solve(n, arr, pa));
}

}
`

【留个坑哈】【明天来填】

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

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

相关文章

【hot100篇-python刷题记录】【找到字符串中所有字母异位词】

R6-滑动窗口篇 印象题 核心&#xff1a; 使用collections方法的Counter计数&#xff0c;统计了某个子串中每个字母出现的次数。 判断子串相等&#xff1a;counter1counter2 &#xff08;注意&#xff1a;此时&#xff0c;counter1或者counter2都不能含有多余的项&#xff0…

JVM系列--初始JVM

根据《黑马程序员JVM虚拟机入门到实战全套视频教程》整理 1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步…

Mysql 集群技术

一、Mysql 在服务器中的部署方法 在企业中90%的服务器操作系统均为Linux在企业中对于Mysql的安装通常用源码编译的方式来进行官网&#xff1a;http://www.mysql.com 1.1 在Linux下部署mysql cmake \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ #指定安装路径 -DMYSQL_DATADI…

【Unity变现】Unity 接入Unity ADS广告

说在前面的话&#xff0c;Unity ADS是Unity官方做的广告变现平台&#xff0c;但广告在我国大陆无法使用&#xff0c;开发时测试的话需要上代理才能看到请求的广告。 如果游戏不准备发布到海外市场&#xff0c;可以不考虑这个平台。 一、注册Unity ADS平台的准备 https://dash…

JavaEE 第17节 网络通信知识扫盲

文章目录 前言一、网络通信的概念二、局域网&广域网 局域网&#xff08;LAN&#xff0c;Local Area Network&#xff09; 广域网 三、IP地址与端口号 1、IP地址 2、端口号 四、网络协议 1、概念&作用 2、协议分层&#xff08;重要&#xff09; 前言 此篇博…

你是如何更精准地指引模型,激发其无尽的创造力?

随着大型语言模型日益凸显其重要性&#xff0c;发掘并充分利用它们的潜力&#xff0c;很大程度上依赖于我们如何巧妙构思和构造指令——即Prompt的精炼艺术。优化Prompt撰写技巧&#xff0c;将能够更好地引导大模型&#xff0c;为各类应用场景生成高质量的文本输出。分享出你的…

CTF杂项题:easy_nbt writeup

题目 题目如图&#xff0c;有一个附件&#xff1a;file.7z 解题思路 CTF的杂项题&#xff0c;对于刚接触的人员来说&#xff0c;很多时候是完全没有思路&#xff0c;解这类题&#xff0c;没有相关知识储备的时候&#xff0c;可以使用文件内容搜索工具搜索flag、ctf、key等关键…

【实现100个unity特效之25】Unity中实现二次元模型,基于光照的内置和URP管线卡通化渲染shader

最终效果 文章目录 最终效果默认效果简单粗暴&#xff0c;使用Unlit/Texture基于光照模型的卡通渲染UnityToonShader——仅支持内置渲染管线基于光照模型的二次元渲染UnityURPToonLitShaderExample——仅支持URP渲染管线 完结 默认效果 不然不做处理&#xff0c;我们的模型默认…

高并发eleme项目登录模块(thirty-three day)

一、配置一主二从mysql 1. mycat对mysql8不完全支持 2. mysql8主从问题不大get_pub_key1 3. gtids事务复制 4. 删除/etc/my.cnf 5. 同步data文件需要先停用mysql服务,删除data目录中的auto.cnf 6. gtid模式以及经典模式都需要锁表 flush tables with read lock; unlock …

怎么用电脑兼职赚钱,普通人可做的6个副业项目(非常详细)零基础入门到精通,收藏这篇就够了

现在的生活中&#xff0c;我们总是感觉所过的日子都很紧张&#xff0c;虽然我们尽可能地工作和努力&#xff0c;但是生活成本和社会压力仍然那么大。为了弥补自己的生活经验和财务困难&#xff0c;很多人开始寻找一种额外的收入来源。 其实这种额外的收入来源就被称之为&#…

google paly修改地区教程【2024自测可用】

【准备信息】 https://usfakename.com/ &#xff1a; 用来生成其他国家&#xff08;比如美国&#xff09;的地址 重要需要填写的内容&#xff1a; 卡号&#xff1a;4532 7875 1109 8437 City:Boulder State:Alabama postcode:35259 可以在美国邮政编码ZIP Code(转载) -…

学习yolo+Java+opencv简单案例(一)

目录 一、大概架构 二、编写pom.xml 1、yolo-study模块&#xff08;root&#xff09;&#xff1a; 2、CameraDetection模块 三、编写yml配置文件 四、编写controller 五&#xff0c;可能会出现的问题 1、修改VM启动参数&#xff1a; 2、修改启动类 六、测试 七&…

gradio如何实现修改代码后自动重载运行

使用自动重载加速开发 前提条件&#xff1a;本指南要求你了解 Blocks。在阅读本指南之前&#xff0c;请确保你已经阅读了Blocks指南。 本指南涵盖自动重载、在Python IDE中的重载&#xff0c;以及在Jupyter Notebooks中使用Gradio。 为什么需要自动重载&#xff1f; 当你使…

C#归并排序算法

前言 归并排序是一种常见的排序算法&#xff0c;它采用分治法的思想&#xff0c;在排序过程中不断将待排序序列分割成更小的子序列&#xff0c;直到每个子序列中只剩下一个元素&#xff0c;然后将这些子序列两两合并并排序&#xff0c;最终得到一个有序的序列。 归并排序实现原…

蓝牙芯片 vs. 蓝牙模块:如何为蓝牙方案做出最佳选择?

不论您是设计全新的低功耗蓝牙产品&#xff0c;还是升级现有产品&#xff0c;开发者都面临的一个关键的选择&#xff1a;是采用蓝牙芯片还是蓝牙模块呢&#xff1f;作为蓝牙技术领域的资深专家&#xff0c;信驰达将从蓝牙芯片与蓝牙模块的各自优缺点进行分析&#xff0c;帮助您…

通过访存地址获取主存数据的过程

目录 1.根据访存地址在Cache中查找数据 2.如果在Cache中命中 3.如果没有命中 4.数据送CPU 5.做几道题&#xff1a; 主要厘清思路&#xff0c;中间细节需自行补充! 1.根据访存地址在Cache中查找数据 ① 访存地址的结构会根据Cache和主存之间的映射方式不同而改变。映射方式…

【MySql】 mysql的组从复制

mysql的组从复制 配置mastesr [rootmysql-node10 ~]# vim /etc/my.cnf [mysqld] datadir/data/mysql socket/data/mysql/mysql.sock symbolic-links0 log-binmysql-bin server-id1 [rootmysql-node10 ~]# /etc/init.d/mysqld restart #进入数据库配置用户权限 [rootmysql-nod…

方差稳定变换(Variance Stabilizing Transformation)介绍,专业生物学领域统计

介绍 方差稳定变换&#xff08;Variance Stabilizing Transformation&#xff0c;VST&#xff09;是一种统计方法&#xff0c;用于将一个具有异方差性的随机变量&#xff08;即方差随着均值的变化而变化的变量&#xff09;转换为方差相对稳定的变量。这种转换在数据分析和建模…

【网络】TCP协议详解(下)

上文介绍了TCP传输控制协议的报头&#xff0c;并且渗透了TCP保证可靠性的策略&#xff1a;如流量控制、按序到达、确认应答机制以及超时重传。本文继续讲解TCP剩下的协议&#xff0c;剩下俩个大话题&#xff0c;难度都比较麻烦。 本文将介绍TCP协议最常见的三次握手和四次挥手…

腾讯地图SDK Android版开发 7 覆盖物示例1

腾讯地图SDK Android版开发 7 覆盖物示例1 前言界面布局MapMarker类常量成员变量初始值Marker点击事件Marker拖拽事件创建覆盖物移除覆盖物设置属性 MapMarkerActivity类控件响应事件 运行效果图 前言 文本介绍Marker的常用属性、交互和碰撞示例。 示例功能如下&#xff1a; …