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.hqwc.cn/news/289225.html

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

相关文章

【C++题目速刷】二分查找

【C题目速刷】二分查找 一、二分查找1、题目链接2、解题3、代码 二、在排序数组中查找元素的第一个和最后一个位置1、题目链接2、解题3、代码4、算法模板 三、x的平方根1、解题链接2、解题3、代码 四、搜索插入位置1、题目链接2、解题3、代码 五、山脉数组的峰顶索引1、题目链接…

令人惊叹的代码技巧

在编程世界中&#xff0c;有一些令人惊叹的代码技巧和巧妙的实现方式。以下是一些我见过的令人印象深刻的代码技巧&#xff1a; 函数式编程魔法&#xff1a; 使用函数式编程的一些特性&#xff0c;比如高阶函数、匿名函数和Lambda表达式&#xff0c;可以使代码更为简洁、易读。…

Apollo Planning——TASK之PathBoundsDecider

在modules/planning/conf/scenario/lane_follow_config.pb.txt配置文件中&#xff0c;我们可以看到LaneFollow所需要执行的所有task。 stage_config: {stage_type: LANE_FOLLOW_DEFAULT_STAGEenabled: truetask_type: LANE_CHANGE_DECIDERtask_type: PATH_REUSE_DECIDERtask_t…

【python】在线代码混淆方案及注意事项

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 在线网站pyob混淆操作步骤编写测试代码混淆转pyc缺点中文路径问题&#xff1a;python: Cant reopen .pyc file 2️⃣ 反编译python文件格式对比uncompyle6 3️⃣ 其它方案cpythonpython-obfuscatorPyInstaller【不推荐】pyminifie…

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

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

【 USRP安装教程】MATLAB 2023B

步骤 matlabdocusrp驱动包 doc 安装包内容列表 双击“R2023b_Doc_Windows.iso” 打开cmd 查看盘符 切换盘符 因为是F盘&#xff0c;所以cmd输入&#xff1a;“F:” F:进入可安装界面 cd F:\bin\win64安装离线文档库 .\mpm install-doc --matlabroot"C:\MATLAB\R202…

外卖系统海外版:技术智能引领全球美食新潮流

随着全球数字化浪潮的推动&#xff0c;外卖系统海外版不仅是食客们品味美食的便捷通道&#xff0c;更是技术智能在美食领域的引领者。本文将深入剖析其背后的技术实现&#xff0c;揭开代码带来的美食革新。 多语言支持&#xff1a;构建全球美食沟通桥梁 def multilingual_su…

【新姿势】SpringBoot下时间配置新方式(同文件大小)

SpringBoot Duration 背景&#xff1a; 在SpringBoot项目中&#xff0c;我们经常需要配置时间参数&#xff0c;作为某一动作的间隔。以往我们通常是在配置文件中定义字段后&#xff0c;直接设置对应的秒或毫秒值&#xff0c;遇到计算时&#xff0c;直接在此基础上做运算。这种…

苏州和数荣获苏州市软件行业协会“杰出贡献理事单位”

2023年12月14日&#xff0c;苏州市软件行业协会第五届第五次理事会议在金螳螂大厦顺利召开。 苏州市工信局副局长万资平&#xff0c;苏州市工信局大数据处处长卢剑荣&#xff0c;苏州市工信局大数据处丁天龙&#xff0c;江苏省软件行业协会副秘书长夏冰莹&#xff0c;苏州市软…

2023美团商家信息

2023美团商家电话、地址、经纬度、评分、均价、执照...

[AutoSar]基础部分 RTE 02 S/R Port 显式/隐式

目录 关键词平台说明一、显式&#xff08;Explicit&#xff09;和隐式&#xff08;Implicit&#xff09;1.1 显式模式1.1.1code 二、隐式模式2.1 code 三、区别 关键词 嵌入式、C语言、autosar、EcuM、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语…

ITIL® 4 Foundation​,12月23日即将开课~想了解点击查看

ITIL 4 Foundation即将开课~ 想报名的必须提前预约啦 &#x1f447;&#x1f447;&#x1f447; 培训地点&#xff1a; 远程直播&#xff1a;线上平台学习 开课时间&#xff1a; 周末班&#xff1a;12月23日、24日&#xff1b; 什么是ITIL&#xff1f; 信息技术基础架构…