The 2022 ICPC Asia Xian Regional Contest(C/E/F/G/J/L)

原题链接:Dashboard - The 2022 ICPC Asia Xian Regional Contest - Codeforces

目录

 J. Strange Sum

 F. Hotel

 C. Clone Ranran

 G. Perfect Word

 E. Find Maximum

 L. Tree 


 J. Strange Sum

题意:思路:当我们选择i=n时,我们则可以选择整个区间,所以我们在这个区间内我们可以分别选择最大的2个元素、最大的1个元素、不选,三者取max即可。

代码:

void solve() {int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+n+1);cout<<max({0ll,a[n],a[n-1]+a[n]})<<endl;
}

 F. Hotel

题意:

思路:对于每个队伍我们进行分治,当队伍中的队员性别都不同的时候,ta们需要住三间房间,总共有两种情况:三人都住单人间,或者三人都住双人间(双人间只住一个人)。当队伍中存在相同性别的队员时,也是只有两种情况:两人一起住双人间,一人住单人间;两人一起住双人间,一人住双人间。每种情况取min然后累加即可。

void solve() {int n,a,b,ans=0;cin>>n>>a>>b;for(int i=1; i<=n; i++) {map<char,int>mp;int now=min(3*a,3*b);cin>>s;for(int j=0; j<=2; j++) {mp[s[j]]++;if(mp[s[j]]==2)now=min(min(now,a+b),2*b);}ans+=now;}cout<<ans<<endl;
}

 C. Clone Ranran

 题意:

思路:若要进行克隆操作的话,肯定是克隆完然后再一起答题是最优的。所以我们枚举克隆次数,答案取min即可。每次枚举的答案为克隆次数+(问题数)/(克隆后的数量)<-(向上取整)。因为它的复杂度是log级别的,所以不会超时。 

代码:

void solve() {int a,b,c,ans=1e18;cin>>a>>b>>c;for(int i=0; i<=34; i++) {int sum=a*i;sum+=b*((c+f[i]-1)/f[i]);ans=min(ans,sum);}cout<<ans<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);f[0]=1;for(int i=1; i<=34; i++)f[i]=f[i-1]*2;int _;cin>>_;while(_--)solve();
}

G. Perfect Word

题意:

思路:若一个单词S满足条件,则它的子串S[1~n-1]和S[2~n]也满足条件,所以我们根据字符串长度从下往上拼出最长的单词,若这个单词S能在比它长度小的set集合中,找到S[1~n-1]和S[2~n]两个字串,说明这个字符合法,放入set,反之continue。答案在模拟的过程中取max即可。

代码:

bool cmp(string a,string b) {return a.size()<b.size();
}
void solve() {vector<string>v;set<string>s;int n,ans=0;cin>>n;for(int i=1; i<=n; i++) {string x;cin>>x;v.push_back(x);}sort(v.begin(),v.end(),cmp);for(int i=0; i<n; i++) {string a=v[i],b,x;if(a.size()==1)s.insert(a),ans=max(ans,1ll);else {x=a,b=a.substr(1),a.pop_back();if(s.count(a)&&s.count(b)) s.insert(x),ans=max(ans,(int)x.size());}}cout<<ans<<endl;
}

 E. Find Maximum

题意: 

思路: 手玩函数(bushi)后可得f(x)表达的是x在三进制下各个位的数之和+三进制长度,所以2是越多越好,我们可以用右边界r来进行贪心。因为已经r是上限了,所以不可能令它三进制的某一位增加,我们对r能进行的操作只有减少它的某一位,然后根据贪心的思想,若它某一位减少了,则该位之后的位都可以变成2,这是因为3^1+3^2+.......+3^(i-1)<3^i,所以就算后面的位都变成2了,也不会超过r的范围,我们需要判的就是变完之后会不会小于l。

总结一下,就是枚举r在三进制上的每一位,然后该位-1,后面的位都变成2,再判断它是否大于l,若合法则答案取min。别忘了把答案的初始值设为f(r)。

代码:

int f(vector<int>v) {//用来计算三进制转换为10进制后的值 reverse(v.begin(),v.end());int sum=0,now=1; for(auto x:v) {sum+=x*now;now*=3;}return sum;
}
int f2(vector<int>v) {//用来计算f(x) reverse(v.begin(),v.end());while(v.size()&&!v.back())v.pop_back();int sum=0;for(auto x:v)sum+=(x+1);return sum;
}
void solve() {vector<int>a;int l,r,rr,ans=0;cin>>l>>r;rr=r;while(rr) {a.push_back(rr%3),ans+=(rr%3+1);rr/=3;}//将r转换为三进制存入vector,并且使ans的初始值为f(r) reverse(a.begin(),a.end());for(int i=0; i<a.size(); i++) {if(!a[i])continue;//若该位为0则无法-1,要到下一位贪心 vector<int>x;x=a,x[i]--;for(int j=i+1; j<x.size(); j++)x[j]=2;//将后面的位全变为2 if(f(x)>=l)ans=max(ans,f2(x));//判断是否合法 }cout<<ans<<endl;
}

L. Tree 

 题意:

思路:条件一可以转化为在树内删一条链,条件二可以转化为在树内删叶子节点,所以我们先跑一遍dfs预处理后,枚举删的叶子节点层数,答案取min即可。具体实现见代码注释。 

代码: 

vector<int>e[maxn];
int dep[maxn],dis[maxn],cnt=0;
//dep[i]表示的是i节点到最深叶子节点的距离
//dis[i]表示的是有多少个节点到叶子节点的距离为i
void dfs(int u) {dep[u]=1;for(auto x:e[u]) {dfs(x);dep[u]=max(dep[u],dep[x]+1);}dis[dep[u]]++;
}
void solve() {int n;cin>>n;for(int i=1; i<=n; i++) e[i].clear(),dis[i]=0;for(int i=2; i<=n; i++) {int x;cin>>x;e[x].push_back(i);}dfs(1);int ans=dep[1];//初始情况是什么叶子都不删的情况,也就是根节点到叶子节点的距离for(int i=1; i<=dep[1]; i++)ans=min(ans,dis[i]+i-1);//i表示删了(i-1)层叶子节点,那么剩下的链的个数就是dis[i]cout<<ans<<endl;
}

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

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

相关文章

Idea 修改默认 Maven 为自己的

每次我们打开新项目时,都要去配置一遍 maven,很麻烦,其实可以去修改 idea 里面默认的 maven 配置,这样后面不管是打开新项目还是老项目,就都是用的自己的 maven 了. 1.文件->新项目设置->新项目的设置 File->Other Settings -> Settings for New Project 2.然后和…

Meteor code must always run within a Fiber 报错解决办法

报错&#xff1a; 这样的写法会出现这个报错 大概的意思就是说&#xff0c;目前你这个函数不是运行在meteor的环境中&#xff0c;所以要使用Meteor.bindEnvironment&#xff0c;来改变函数运行的上下文 解决办法&#xff1a;

七大排序算法——直接插入排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、直接插入排序核心思想代码实现 三、性能分析四、七大排序算法性能对比 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#…

05-算法部分 (数据结构和算法)

一 排序算法 1.1 冒泡法排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。 首先从数组的第一个元素开始到数组最后一个元素为止&#x…

5. Redis优化秒杀、Redis消息队列实现异步秒杀

文章目录 Redis优化秒杀、Redis消息队列实现异步秒杀一、秒杀优化1.1 回顾“一人一单”秒杀业务代码1.2 异步秒杀思路1.3 基于Redis完成秒杀资格判断1.3.1 修改VoucherServiceImpl1.3.2 Lua脚本编写1.3.3 Redislua判断用户是否抢购成功1.3.4 基于阻塞队列实现异步秒杀下单1.3.4…

python+requests接口自动化测试

原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的是java语言&#xff0c;但对于一个学java&…

DaVinci Resolve Studio 18对Mac和Windows系统的要求

DaVinci Resolve Studio 18 是一款功能强大的专业视频编辑和调色软件&#xff0c;它提供了全面的工具和功能&#xff0c;让用户能够完成从剪辑、调色到特效和音频处理等各个方面的任务。DaVinci Resolve Studio 18 在中文界面上进行了优化&#xff0c;使得中文用户能够更加方便…

【C语言】约分最简式

题目描述&#xff1a; 分数可以表示为分子/分母的形式。编写一个程序&#xff0c;要求用户输入一个分数&#xff0c;然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时&#xff0c;不需要表达为整数又分数的形…

使用fast测试的错误

错误&#xff1a;Connection refused: connect 分析&解决 检查服务的端口号和fast生成请求时的端口号是否一致&#xff0c;不一致会报上面的错误 分析&#xff1a;设置服务配置的方法很多&#xff0c;可以写在配置文件里&#xff0c;也可以写在命令行里&#xff0c;当有多…

科目一速通技巧笔记,简记

常规 累计积分制度&#xff08;12满&#xff09;周期12月 虚假材料1年&#xff0c;假1吊二撤三醉五逃终身 假1500 骗三2k以下 初次领证1年实习期、实习标志&#xff0c;18~70岁 拼装车、报废车&#xff0c;吊销 200~2k 没有中心线&#xff08;一条路&#xff09;城市道路3…

keep-alive和router-view配合使用缓存整个路由页面以及路由切换

实现内容&#xff1a;通过vue实现&#xff0c;在页面有侧边栏动态来展示当前页面流程&#xff0c;右边进行页面的切换&#xff0c;左右两边都是组件&#xff0c;但是A/B/C组件的切换是通过keep-alive搭配router-view实现的&#xff0c;首先在当前文件中创建五个文件&#xff1a…

Hive SQL 迁移 Flink SQL 在快手的实践

摘要&#xff1a;本文整理自快手数据架构工程师张芒&#xff0c;阿里云工程师刘大龙&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; Flink 流批一体引擎 Flink Batch 生产实践 核心优化解读 未来规划 点击查看原文视频…