Codeforces Round 916 (Div. 3)(G未补)

news2024/11/15 15:47:55

目录

A. Problemsolving Log

B. Preparing for the Contest

C. Quests

D. Three Activities

E1.E2. Game with Marbles

F. Programming Competition


A. Problemsolving Log

题意:A任务需要一分钟完成,B任务需要两分钟完成,……以此类推,给定一串任务s,由大写英文字母组成, 第i个字符表示完成了s【i】,问能完成多少个任务

思路:统计一下每个字符出现的次数,然后根据题意判断一下即可

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1e5 + 10;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int t;cin>>t;
    while(t--)
    {
        int n;cin>>n;
        string s;
        cin>>s;
        // cout<<s<<endl;
        int cnt=0;
        map<char,int>mp;
        vector<bool>st(26,0);

        for(int i=0;i<n;i++)
        {
            mp[s[i]]++;
            int c=(int)(s[i]-'A')+1;
            // cout<<c<<endl;
            if(mp[s[i]]>=c&&!st[s[i]-'A'])cnt++,st[s[i]-'A']=1;
            // if(s[i]<='a'+i)cnt++;
        }
        cout<<cnt<<"\n";
    }
    return 0;
}

B. Preparing for the Contest

题意:给定一串序列,如果一个第i个数字大于第i-1个数字,那么就会兴奋一次,第一个数字不会兴奋,给定一个n和k,要求构造一个长度为n的序列,满足恰好兴奋k次

思路:从小到大顺序输出k个数字,再从大到小逆序输出n-k个数即可

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1e5 + 10;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int t;cin>>t;
    while(t--)
    {
        int n,k;cin>>n>>k;
        for(int i=n-k;i>=1;i--)cout<<i<<" ";
        for(int i=n-k+1;i<=n;i++)cout<<i<<" ";
        cout<<endl;
    }
    return 0;
}

C. Quests

题意:给定n个任务,只有当第i个任务前的所有任务都至少完成过一次后,才能完成第i个任务,每个任务可以完成若干次,第一次完成会获得a_{i}的经验值,后面再次完成会获得b_i的经验值,给定一个数字k,问在k次内能取得的最大经验值

思路:从第一个任务开始,对于每个任务,我们可以选择继续做下一个任务,或者选择之前做过的任务中经验值最大的任务,不断遍历,去max即可

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1e5 + 10;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int t;cin>>t;
    while(t--)
    {
        int n,k;cin>>n>>k;
        vector<int>a(n),b(n);
        for(int i=0;i<n;i++)cin>>a[i];
        for(int i=0;i<n;i++)cin>>b[i];

        int ans=0,sum=0,maxv=0;
        for(int i=0;i<min(n,k);i++)
        {
            sum+=a[i];
            maxv=max(maxv,b[i]);
            if(k-i-1>=0)ans=max(ans,sum+(k-i-1)*maxv);
            ans=max(ans,sum);
        }
        cout<<ans<<"\n";
    }
    return 0;
}

D. Three Activities

题意:给定3个序列a,b,c,要求找到a_{i}+b_{j}+c_{k}最大,且i,j,k互不相等

思路:对于每个序列进行从大到小的排序后,我们会发现,我们可以在每个序列中的前3个中各选一个找到一个满足题意的答案,暴力计算一下即可,时间复杂度为O(3^{3}).

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

#define x first
#define y second

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1e5 + 10;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int t;cin>>t;
    while(t--)
    {
        int n;cin>>n;
        vector<pii>a(n),b(n),c(n);
        for(int i=0;i<n;i++)cin>>a[i].x,a[i].y=i;
        for(int i=0;i<n;i++)cin>>b[i].x,b[i].y=i;
        for(int i=0;i<n;i++)cin>>c[i].x,c[i].y=i;

        sort(a.begin(),a.end(),greater<pii>());
        sort(b.begin(),b.end(),greater<pii>());
        sort(c.begin(),c.end(),greater<pii>());

        int ans=0;
        for(int i=0;i<min(n,5);i++)
        {
            for(int j=0;j<min(n,5);j++)
            {
                for(int k=0;k<min(n,5);k++)
                {
                    if(a[i].y==b[j].y||a[i].y==c[k].y||b[j].y==c[k].y)continue;
                    ans=max(ans,a[i].x+b[j].x+c[k].x);
                }
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}

E1.E2. Game with Marbles

题意:有两个人Alice和Bob,他们有n种糖果,Alice拥有每种糖果a_{i}个,Bob拥有每种糖果b_{i}个,从Alice开始,每次可以选择一个两人都有的糖果i(即a_{i}>0,b_{i}>0),然后对于第i个糖果,a_{i}=a_{i}-1,b_{i}=0。下一回合轮到Bob,Bob同样选择一个两人都有的糖果i(即a_{i}>0,b_{i}>0),然后对于第i个糖果a_{i}=0,b_{i}=b_{i}-1,如果两人都不能选择一个糖果i进行上述操作,则结束操作,得分就是Alice的糖果总数减去Bob的糖果总数,Alice希望得分尽可能的大,Bob希望得分尽可能的小,问如果双方都进行最优操作,最后的得分是多少/

思路:

可以考虑下为什么 Alice 会选择颜色 i,而非选择颜色 j:

  • 如果 Alice 选了颜色 i , Bob 选了颜色 j ,这一回合的得分就是(a_{i}-1)+(1-{b_{j}})=a_{i}-b_{j}
  • 如果 Alice 选了颜色 j , Bob 选了颜色 i ,这一回合的得分就是 (a_{j}-1)+(1-b_{i})=a_{j}-b_{i}
  • 所以需要满足 a_{i}-b_{j}>a_{j}-b{i}->a_{i}+b_{i}>a_{j}+b_{j}

因此我们对 a_{i}+b_{i} 进行排序就可以了。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

#define x first
#define y second

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1e5 + 10;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int t;cin>>t;
    while(t--)
    {
        int n;cin>>n;
        vector<pii>a(n),b(n),c(n);
        for(int i=0;i<n;i++)cin>>a[i].x,a[i].y=i;
        for(int i=0;i<n;i++)cin>>b[i].x,b[i].y=i;
        for(int i=0;i<n;i++)cin>>c[i].x,c[i].y=i;

        sort(a.begin(),a.end(),greater<pii>());
        sort(b.begin(),b.end(),greater<pii>());
        sort(c.begin(),c.end(),greater<pii>());

        int ans=0;
        for(int i=0;i<min(n,5);i++)
        {
            for(int j=0;j<min(n,5);j++)
            {
                for(int k=0;k<min(n,5);k++)
                {
                    if(a[i].y==b[j].y||a[i].y==c[k].y||b[j].y==c[k].y)continue;
                    ans=max(ans,a[i].x+b[j].x+c[k].x);
                }
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}

F. Programming Competition

这题地题解是看这位大佬的:https://zhuanlan.zhihu.com/p/673159169

题意:给定一棵树,每个节点除了不可以跟其祖宗节点进行匹配,其余都可以匹配。问最大匹配数。

思路:有一个很经典的题目就是,如果有n种不同类型的糖果,总数为s,两个不同的糖果可以配对成一组,问最多配对多少组。

显然,如果数量最多的糖果不超过总数的一半,那我们总是可以配对出\lfloor \frac{s}{2} \rfloor组。否则我们就无法用完数量最多的糖果,假设最大的糖果有mx个,那我们只能配对出s-mx组。

回到这题,对于每个节点,我们把不同子树内的点认为是不同的类型。所以如果出现当前最大的子树里点不超过当前节点的所有子节点总数的一半,那我们可以把剩下所有点都配对,然后退出即可。否则我们肯定是把其他子树内的点和最大的子树内的点配对完之后再递归处理最大的子树。

递归到子树的时候,某些该子树内的点已经在之前配对过了,显然应该贪心地让当前子树地根与外面地点配对,这样一定是最优地,因为根不可能和子树地任何点配对

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 2e5 + 10;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

    int t;cin>>t;
    while(t--)
    {
        int n;cin>>n;
        vector<vector<int>>g(n+1);//注意这里要用这种写法,不能写成vector<int>g[n+1],否则dfs会报错,不知道为什么
        for(int i=2;i<=n;i++)
        {
            int x;cin>>x;
            g[x].push_back(i);
        }

        vector<int>sz(n+1);//记录每个节点的子节点个数

        //统计每个节点的子节点个数
        auto dfs1 = [&](auto &&dfs1,int u)->void    
        {
            sz[u]=1;
            for(auto &j:g[u])
            {
                dfs1(dfs1,j);
                sz[u]+=sz[j];
                if(sz[j]>sz[g[u][0]])swap(j,g[u][0]);
            }
        };
        dfs1(dfs1,1);

        int ans=0;

        //找到最大匹配数,u为当前节点,c为上一轮能匹配的数量
        auto dfs2 = [&](auto &&dfs2,int u,int c)->void
        {
            if(g[u].empty())return;
            if(c>=sz[u])return;
            if(c>0)c-=1;//减1表示减去的是根节点,将根节点跟其他节点匹配

            int sum=0;//统计该节点的子节点个数
            for(auto j:g[u])sum+=sz[j];
            int mx=sz[g[u][0]];//该节点的子节点中节点个数最多的点

            if(mx-c<=sum-mx)//说明当前节点的最大子节点个数减去上一轮与其他节点匹配的数量之后小于总数的一半
            {
                ans+=(sum-c)/2;//那么答案就是总数的一半
                return;
            }

            ans+=sum-mx;//否则记录下来此时能匹配的最多的个数
            c+=sum-mx;//记录下来能匹配的最多的个数
            dfs2(dfs2,g[u][0],c);
        };
        dfs2(dfs2,1,0);
        cout<<ans<<"\n";
    }    
    return 0;
}

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

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

相关文章

Dockerfile指令参考

写在前面 这里是原文链接&#xff0c;本文学习Dockerfile中的指令。 指令表格 指令描述ADD添加本地文件或远程文件到imageARG环境变量CMD运行container时执行的命令COPY复制文件或目录到imageENTRYPOINT运行container时执行的命令&#xff08;优先级高&#xff09;ENV环境变…

Hudi Clustering

核心概念 Hudi Clustering对于在数据写入和读取提供一套相对完善的解决方案。它的核心思想就是&#xff1a; 在数据写入时&#xff0c;运行并发写入多个小文件&#xff0c;从而提升写入的性能&#xff1b;同时通过一个异步&#xff08;也可以配置同步&#xff0c;但不推荐&…

SQL注入绕过正则及无列名注入

渗透测试 一、select\b[\s\S]*\bfrom正则二、科学计数法绕过三、过滤information四、无列名注入1、利用 join-using 注列名。2、无列名查询 五、报错注入7大常用函数1.ST_LatFromGeoHash()&#xff08;mysql>5.7.x&#xff09;payload 2.ST_LongFromGeoHash&#xff08;mysq…

3 - Electron app BrowserWindow对象-关于窗口

优雅的打开应用~ 当加载缓慢&#xff0c;打开应用的一瞬间会出现白屏&#xff0c;以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

C#文件操作(一)

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第20章《文件》 二、操作文件的相关类 在C#应用程序中Syste.IO名称空间包含用于在文件中读写数据的类。在此我列举一下File、Directory、Path、FileInfo、DirectoryInfo、FileSystemInfo、FileSystemWatcher。其中在Syste…

pnpm :无法加载文件 D:\nodejs\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

目录 一、问题描述 二、原因分析 三、解决问题 一、问题描述 pnpm : 无法加载文件 D:\learningsoftware\nodejs\node_global\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID1351 70 中的 a…

文件包含 [SWPUCTF 2021 新生赛]include

打开题目 要求我们传入一个file进去&#xff0c;那我们get传入 /?file1 得到源码&#xff0c;并且提示我们flag在flag,php下 在源代码中&#xff0c;我们看见了allow_url_include函数&#xff0c;我们知道这涉及到文件包含。 一般默认allow_url_fopen是on的&#xff0c;那在…

线性回归中的似然函数、最大似然估计、最小二乘法怎么来的(让你彻底懂原理)收官之篇

图1 图2 图3 图4 问1&#xff1a;为什么要引入似然函数&#xff1f; 在线性回归中引入似然函数是为了通过概率统计的方法对模型参数进行估计。简单来说&#xff0c;我们希望找到一组参数&#xff0c;使得我们观测到的数据在给定这组参数的情况下最有可能发生。 问:1&#xf…

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合&#xff0c;实现对这些数据…

Android Canvas状态save与restore,Kotlin

Android Canvas状态save与restore&#xff0c;Kotlin private fun f1() {val bitmap BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val canvas Canvas(bitmap)val paint Paint(Paint.ANTI_ALIAS_FLAG)paint.color Color.RED…

信息收集 - 网站架构

网站架构组成 通常,一个典型的网站架构包括以下组件: 动态脚本语言:动态脚本语言用于处理网站的逻辑和动态内容生成。常见的动态脚本语言包括PHP、Python、Ruby和Node.js等。这些脚本语言可以根据用户请求生成动态的网页内容。 数据库:数据库用于存储网站的数据,包括用户…

网易面试:亿级用户,如何做微服务底层架构?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 微服务改造&#xff0c;你是怎么做的&#xff1…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

路由表route

目录 Windows维护路由表&#xff0c;利用route命令&#xff0c;VPN完美异地组网什么是多网络环境这里我做个情景演示重置ipv4网络再次确认一下网络背景网关是什么多网络规划思路最后拓展内容实测一下网关切换选项网关的网关命令整理 Windows维护路由表&#xff0c;利用route命令…

补题与周总结:leetcode第 376 场周赛

文章目录 复盘与一周总结2967. 使数组成为等数数组的最小代价&#xff08;中位数贪心 回文数判断&#xff09;2968. 执行操作使频率分数最大&#xff08;中位数贪心 前缀和 滑窗&#xff09; 复盘与一周总结 wa穿了第3题&#xff0c;赛时其实想到了思路&#xff1a;中位数贪心…

中央空调冷却塔循环水全自动加药装置PH电导率设备工作原理动画

一&#xff1a;全自动加药装置【概述】 随着在给水、排水处理过程中&#xff0c;常常投加各类化学药剂作为阻垢、杀菌灭藻、混凝、絮凝用&#xff0c;以达到净化水的目的。这些药剂有固体颗粒、液体&#xff0c;在投加过程中必须溶解、稀释及按配比定量投加方能取得最佳效果&am…

GZ015 机器人系统集成应用技术样题6-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题6 选手须知&#xff1a; 本任务书共 25页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

DC-8靶场

目录 DC-8靶场链接&#xff1a; 首先进行主机发现&#xff1a; sqlmap得到账号密码&#xff1a; 反弹shell&#xff1a; exim4提权&#xff1a; Flag&#xff1a; DC-8靶场链接&#xff1a; https://www.five86.com/downloads/DC-8.zip 下载后解压会有一个DC-8.ova文件…

西门子S71200系列PLC通过PROFINET连接多功能电表

西门子S71200连接多功能电表 1、需求描述&#xff1a; 通过西门子S7-1200系列PLC&#xff0c;连接多功能电表&#xff0c;通过Modbus协议读写电表的数据。 2、方案描述&#xff1a; 桥接器的网口连接西门子S7-1200系列PLC的网口&#xff0c;串口连接到电表的485通讯口&#x…