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

目录

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 secondusing 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 secondusing 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.rhkb.cn/news/221398.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC实战之权限拦截Authorize使用

1&#xff0c;具体的实现方法代码如下 public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter{/// <summary>/// 如果需要验证权限的时候&#xff0c;就执行进来/// </summary>/// <param name"filterContext"></par…

代码随想录算法训练营第四十一天|198.打家劫舍 ,213.打家劫舍II ,337.打家劫舍III

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

设计模式(三)-结构型模式(5)-外观模式

一、为何需要外观模式&#xff08;Facade&#xff09;? 要实现一个大功能&#xff0c;我们需要将它拆分成多个子系统。然后每个子系统所实现的功能&#xff0c;就由一个称为外观的高层功能模块来调用。这种设计方式就称为外观模式。该模式在开发时常常被使用过&#xff0c;所…

HTML CSS 进度条

1 原生HTML标签 <meter>&#xff1a;显示已知范围的标量值或者分数值<progress>&#xff1a;显示一项任务的完成进度&#xff0c;通常情况下&#xff0c;该元素都显示为一个进度条 1.1 <meter> <html><head><style>meter{width:200px;}…

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

解决 Hbuilder打包 Apk pad 无法横屏 以及 H5 直接打包 成Apk

解决 Hbuilder打包 Apk pad 无法横屏 前言云打包配置 前言 利用VUE 写了一套H5 想着 做一个APP壳 然后把 H5 直接嵌进去 客户要求 在pad 端 能够操作 然后页面风格 也需要pad 横屏展示 云打包 配置 下面是manifest.json 配置文件 {"platforms": ["iPad"…

Axure中如何使用交互样式交互事件交互动作情形

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure中交互样式 1、什么是交互样式&#xff1f; 2、交互样式的作用&#xff1f; 3、Axure中如何…

Postman使用总结--生成测试报告

1.执行生成的命令格式 newman run 用例集文件 .json -e 环境文件 .json -d 数据文件 .json/.csv -r htmlextra --reporter- htmlextra-export 测试报告名 .html -e 和 -d 是 非必须的。 如果没有使用 环境&#xff0c;不需要指定 -e 如果没有使用 数据…

Educational Codeforces Round 160 (Div. 2) A~E

A.Rating Increase&#xff08;思维&#xff09; 题意&#xff1a; 给出一个仅包含数字的字符串 s s s&#xff0c;要求将该字符串按以下要求分成左右两部分 a , b a,b a,b&#xff1a; 两个数字均不包含前导 0 0 0 两个数字均大于 0 0 0 b > a b > a b>a 如果…

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

java中常用的加密算法总结

目前在工作中常用到加密的一些场景&#xff0c;比如密码加密&#xff0c;数据加密&#xff0c;接口参数加密等&#xff0c;故通过本文总结以下常见的加密算法。 1. 对称加密算法 对称加密算法使用相同的密钥进行加密和解密。在Java中&#xff0c;常见的对称加密算法包括&…

网络基础介绍

1.网线制作 1.1 网线制作需要的工具 网线 网线钳 水晶头 测试仪 ​编辑 1.2 网线的标准 1.3 网线的做法 2.集线器&交换机&路由器的介绍 3.OSI七层模型 4.路由器的设置 4.1 常见的路由器设置地址 4.2 常见的路由器账号密码 4.3 登录路由器 设置访客网…

【Axure RP9】中继器应用及相关案例

一 中继器简介 1.1 中继器是什么 中继器&#xff08;Repeater&#xff09;是一种高级的组件&#xff08;Widget&#xff09;&#xff0c;用于显示文本、图像和其他元素的重复集合。它是一个容器&#xff0c;容器中的每一个项目称作“item”&#xff0c;由于“item”中的数据由…

【Spark精讲】Spark五种JOIN策略

目录 三种通用JOIN策略原理 Hash Join 散列连接 原理详解 Sort Merge Join 排序合并连接 Nested Loop 嵌套循环连接 影响JOIN操作的因素 数据集的大小 JOIN的条件 JOIN的类型 Spark中JOIN执行的5种策略 Shuffle Hash Join Broadcast Hash Join Sort Merge Join C…

【面试】Java最新面试题资深开发-微服务篇(1)

问题九&#xff1a;微服务 什么是微服务架构&#xff1f;它与单体架构相比有哪些优势和劣势&#xff1f;解释一下服务发现和服务注册是什么&#xff0c;它们在微服务中的作用是什么&#xff1f;什么是API网关&#xff08;API Gateway&#xff09;&#xff1f;在微服务中它有何…

issue阶段的选择电路的实现

1-of-M的仲裁电路 为什么要实现oldest-first 功能的仲裁呢&#xff1f; 这是考虑到越是旧的指令&#xff0c;和它存在相关性的指令也就越多&#xff0c;因此优先执行最旧的指令&#xff0c;则可以唤醒更多的指令&#xff0c;能够有效地提高处理器执行指令的并行度,而且最旧的指…

德人合科技 | 公司电脑文件加密系统

公司电脑文件加密系统是一种可以对电脑文件进行加密的保护机制。它使用驱动层透明加密技术&#xff0c;能够在用户无感知的情况下对文件进行加密&#xff0c;从源头上保障数据安全和使用安全。 PC端访问地址&#xff1a; www.drhchina.com 此类系统主要有以下几个特点和功能&a…

免 费 搭 建 小程序商城,打造多商家入驻的b2b2c、o2o、直播带货商城

在数字化时代&#xff0c;电商行业正经历着前所未有的变革。鸿鹄云商的saas云平台以其独特的架构和先进的理念&#xff0c;为电商行业带来了全新的商业模式和营销策略。该平台涉及多个平台端&#xff0c;包括平台管理、商家端、买家平台、微服务平台等&#xff0c;涵盖了pc端、…

基于RocketMQ实现分布式事务

前言 在上一篇文章Spring Boot自动装配原理以及实践我们完成了服务通用日志监控组件的开发&#xff0c;确保每个服务都可以基于一个注解实现业务功能的监控。 而本文我们尝试基于RocketMQ实现下单的分布式的事务。可能会有读者会有疑问&#xff0c;之前我们不是基于Seata完成了…

【K8S基础】-k8s的核心概念pod

一、Pod 是什么 1.1 Pod 的定义和概念 在Kubernetes中&#xff0c;Pod是创建或部署的最小/最简单的基本单位。一个Pod代表着集群上正在运行的一个进程&#xff0c;它封装了一个或多个应用容器&#xff0c;并且提供了一些共享资源&#xff0c;如网络和存储&#xff0c;每个Pod…