河南萌新联赛2024第(六)场:郑州大学(补题ABCDFGIL)

news/2024/9/18 12:35:18/ 标签: c++, 二分, 树状数组, 萌新联赛

文章目录

  • 河南萌新联赛2024第(六)场:郑州大学
  • A 装备二选一(一)
    • 简单介绍:
    • 思路:
    • 代码:
  • B 百变吗喽
    • 简单介绍:
    • 思路:
    • 代码:
  • C 16进制世界
    • 简单介绍:
    • 思路:
    • 代码:
  • D 四散而逃
    • 简单介绍:
    • 思路:
    • 代码:
  • F 追寻光的方向
    • 简单介绍:
    • 思路:
    • 代码
  • G 等公交车
    • 简单介绍:
    • 思路:
    • 代码:
  • I 正义从不打背身:
    • 简单介绍:
    • 思路:
    • 代码:
  • L koala的程序
    • 简单介绍:
    • 思路:
    • 代码:

河南萌新联赛2024第(六)场:郑州大学

比赛链接

A 装备二选一(一)

简单介绍:

66E61d他拥有一个可以为他增加a%的暴击率,发生暴击时会使他本次普通攻击伤害变为原来的b倍

现在存在另一个武器,可以为他增加a%的暴击率,发生暴击时会使他本次普通攻击伤害变为原来的b倍,询问是否能替换获得更高输出能力

这个题卡了我好久,都不准备写了,后来带个数考虑到了占比问题

思路:

我们将最开始的能力当作100,然后分为两部分,暴击的乘以其倍数,不暴击的不变,结果求和,比较两个武器哪个更好

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define fir(i,a,b) for(int i=a;i<=b;i++)
#define PII pair<int,int> 
#define fi first
#define se second
#define tup tuple<int,int,int>
//int a[110],b[110];
void solve()
{int a,b,c,d;cin>>a>>b>>c>>d;if(a*b+(100-a)<c*d+(100-c))cout<<"YES"<<endl;elsecout<<"NO"<<endl;	
}
signed main()
{IOSint t;t=1;//cin>>t;while(t--)solve();return 0;
}

B 百变吗喽

简单介绍:

给出两个字符串s,t,确保给出的字符串len(s)=len(t)-1,我们可以进行一次操作:在任意位置插入任意小写字母,求出有多少种操作方案

思路:

  1. 用两个数组存储s,t中各个字母出现的次数,比较s,t ,将其字符不同的位置用r记录
  2. 比较两个数组记录的字母数量,如果不同则用c累加差值,用q记录该字符
  3. 如果想要根据插入即可让字符串相等,那么两个数组应只有一个字母数量不同,即c值为1,因此如果c不等于1,输出0即可
  4. 如果首次出现不同的位置在1,则**只有1种解法,**输出位置0与字符q即可
  5. 如果不在1,则判断该位置紧挨着是否出现重复该字符及次数w,因为如果重复则可以插在不同位置,有不同的方案,靠前第一个与该字符不同的位置开始插入,有w种方案

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int a[1000010],b[1000010];void solve()
{int ty=0;string s,t;cin>>s>>t;for(int i=0;i<s.size();i++){a[s[i]-'a']++;}for(int i=0;i<t.size();i++){b[t[i]-'a']++;}int r=-1;for(int i=0;i<t.size();i++){if(s[i]!=t[i]){r=i;break;}}if(r==0)ty=1;if(r==-1)r=t.size()-1;
//	cout<<r<<endl;char q;int c=0;for(int i=0;i<26;i++){if(a[i]!=b[i]){q=i+'a';c+=abs(a[i]-b[i]);}}//cout<<q<<endl;if(c!=1)cout<<"0"<<endl;else if(ty==1){cout<<"1"<<endl;cout<<"0 "<<q<<endl;}else{int w=1,u=r;for(int i=r-1;i>=0;i--){if(t[i]==t[r]){w++;u=i;}elsebreak;}int i=u;cout<<w<<endl;while(w--){cout<<i<<" "<<q<<endl;i++;}}
}signed main()
{IOSint t;t=1;// cin>>t; while(t--)solve();return 0;
}

C 16进制世界

简单介绍:

这是一个类似于01背包的问题,不过多了一个限制条件幸福度,幸福度必须为16的倍数

思路:

直接按照类似于01背包处理,需要16的倍数这一限制条件,我们可以对16取模增加一维幸福度的判断,关于背包问题可以参考博客

代码:

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define int long long
using namespace std;
const int N = 1e5 + 10;
int dp[N][20];
void solve() 
{int n,m;cin>>n>>m;memset(dp,-0x3f,sizeof(dp));dp[0][0]=0;for(int i=1;i<=n;i++){int v,w;cin>>v>>w;w%=16;for(int i=m;i>=v;i--){for(int j=0;j<16;j++){dp[i][j]=max(dp[i-v][(j+w)%16]+1,dp[i][j]);}}}int ans=INT_MIN;for(int i=0;i<=m;i++){ans=max(ans,dp[i][0]);}cout<<ans<<endl;return;
}signed main()
{IOS;int t = 1;while (t--) solve();return 0;
}

D 四散而逃

简单介绍:

n个格子排成一排,每个格子有a[i]个人,每次奔逃选择三个下标,i,j, k使得1<=i<j<k<=n,并且a[j]>=2,从j号格子中选择两人分别逃到i号和k号格子

求出最少需要多少次奔逃才能够让所有人都到达1号格子或者n号格子。若无论多少次操作都做不到,就输出-1

思路:

  1. 如果n为3时,我们可以发现中间的数为奇数时,最后会剩下一个1无法处理,因此输出-1,如果为偶数,则除以2即为结果
  2. 如果2至(n-1),这些方格都为1人,我们无从下手,因此也输出-1
  3. 当其他情况时,我们可以在选择大于等于2人奔逃时,让人跑向奇数方格中,这样就可以使其变为偶数
  4. 由于每个奇数都要尽力变为偶数,因此如果该方格人数x为偶数时,需要奔逃次数为x/2,为奇数时,需要奔逃次数为(x+1)/2,最终将n个格子需要奔逃次数相加输出即可

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define fir(i,a,b) for(int i=a;i<=b;i++)
#define PII pair<int,int> 
#define fi first
#define se second
#define tup tuple<int,int,int>
int a[1000010];
map<int,int>p;
void solve()
{int n;cin>>n;int q=0;int sum=0;for(int i=1;i<=n;i++){cin>>a[i];if(i>1&&i<n){if(a[i]>1)q=1;}}//cout<<q<<endl;if(n==3){if(a[2]%2==0)cout<<a[2]/2<<endl;elsecout<<"-1"<<endl;}else if(q==0)cout<<"-1"<<endl;else{for(int i=2;i<n;i++){sum+=(a[i]+1)/2;}cout<<sum<<endl;}
}
signed main()
{IOSint t;t=1;//cin>>t;while(t--)solve();return 0;
}

F 追寻光的方向

简单介绍:

小G所在道路有n个路灯,每个路灯发出的光亮为l[i],小G每次全力以赴跑到最亮的路灯下休息,然后继续跑到下一个最亮的路灯下,求出小G如果想到达第n个路灯下,需要休息几次?

思路:

  1. map容器将路灯的亮度与位置对应存入
  2. 将路灯亮度排序,倒着遍历其位置,如果该路灯的位置在比他亮的路灯之前则无需处理,如果在之后则需要将休息次数加一
  3. 由于最后一段到n的路程无需休息,所以输出时应该将休息次数减一输出

这个题我多想了,我刚开始想如果有两个相等的数,下标是不是需要一个二维数组或者容器来储存呢?

后来我发现,同一个数字的话,我们只记录最后的那个下标就可以啦,多想咯

代码

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define fir(i,a,b) for(int i=a;i<=b;i++)
#define PII pair<int,int> 
#define fi first
#define se second
#define tup tuple<int,int,int>
int a[1000010];
map<int,int>p;
void solve()
{int n;cin>>n;//int ma=INT_MIN;for(int i=1;i<=n;i++){cin>>a[i];p[a[i]]=i;}sort(a+1,a+n+1);int r=-1;int w=0;for(int i=n;i>0;i--){if(p[a[i]]>r){w++;r=p[a[i]];}}cout<<w-1<<endl;
}
int main()
{IOSint t;t=1;//cin>>t;while(t--)solve();return 0;
}

G 等公交车

简单介绍:

给出各个站点到发车点的距离和公交车的发车时刻,接下来求出在时刻t时来到了x号站点的乘客的最少等待时间,如果无法乘上车,则输出”TNT“

思路:

  1. 如果该乘客到达的时间点比最晚发车到达其站台的车还要迟,则无法乘车
  2. 我们在乘客所在站点的距离,依次加发车时刻,为不同车到达该站点的时间(因为公交车1米/分钟),直到出现第一个大于乘客下车的时刻,用这个时刻减去乘客下车时刻即为所需等待的最短时间

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define fir(i,a,b) for(int i=a;i<=b;i++)
#define PII pair<int,int> 
#define fi first
#define se second
#define tup tuple<int,int,int>
int a[100010],b[100010];
void solve()
{memset(b,0,sizeof(b));int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=m;i++){cin>>b[i];}int q;cin>>q;int x,y;for(int i=1;i<=q;i++){cin>>x>>y;if(x>a[y]+b[m])cout<<"TNT"<<endl;else{int ty;for(int i=1;i<=m;i++){if(a[y]+b[i]>=x){ty=a[y]+b[i];break;}}cout<<ty-x<<endl;}} 
}
signed main()
{IOSint t;t=1;//cin>>t;while(t--)solve();return 0;
}

I 正义从不打背身:

简单介绍:

小x面前有n个敌人,他只能击败正对自己的敌人,每次操作为将1.2.3…n位置变换为n.n-1…3.2.1,然后将敌人旋转180度,请求出m次操作后,敌人是否全被击败

思路:

请添加图片描述

  1. 我们通过具体操作发现其位置出现是有规律的,m次操作即为m,m-2,…依次减2,然后正着将未输出的全部输出即为所求顺序
  2. 翻转奇数次则变换,偶数次则不变,次数为m-i+1,然后根据是否正面朝向判断是否被击败

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define fir(i,a,b) for(int i=a;i<=b;i++)
#define PII pair<int,int> 
#define fi first
#define se second
#define tup tuple<int,int,int>
int a[2000010],b[2000010];
void solve()
{int n,m;cin>>n>>m;string s;cin>>s;s=" "+s; for(int i=1;i<=m;i++){if((m-i+1)%2!=0){if(s[i]=='P')b[i]=0;elseb[i]=1;}else{if(s[i]=='P')b[i]=1;elseb[i]=0;}}int k=0;int t;if(m%2==0)t=1;elset=2;for(int i=m;i>=1;i-=2){a[++k]=b[i];}for(int i=t;i<=m;i+=2){a[++k]=b[i];}if(n>m){for(int i=m+1;i<=n;i++){a[++k]=(s[i]=='P');}}for(int i=1;i<=n;i++){cout<<a[i]<<" ";}cout<<endl;return;
}
signed main()
{IOSint p;p=1;//cin>>t;while(p--)solve();return 0;
}

L koala的程序

简单介绍:

这是一个约瑟夫环问题,n个人,从第一个人开始,从1报数,报到m的人出局,下个人接着从1报数,n个人报完再从第一个人轮换,直到最后剩一个人为止,给出n-1个人的出局顺序

思路:

  1. 我们可以用树状数组+二分来解决这个问题,我们将人数用树状数组的存储方式存入数组,我们想查找前面有多少人时可以引用函数sum来求解
  2. 我们用二分可以找到出局的人
  3. 当出局一个人时,我们用add(l,-1),即可达到更新维护前缀和的目的
  4. 每次出局后,记得更新剩余人数

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define fir(i,a,b) for(int i=a;i<=b;i++)
#define PII pair<int,int> 
#define fi first
#define se second
#define tup tuple<int,int,int>
int tr[2000010]; 
int n,m;
int lowbit(int x)
{return x&(-x);
}void add(int a,int b)
{for(int i=a;i<=n;i+=lowbit(i)){tr[i]+=b;}	
}int sum(int c)
{int res=0;for(int i=c;i>0;i-=lowbit(i)){res+=tr[i];}return res;
}void solve()
{//int n,m;cin>>n>>m;	for(int i=1;i<=n;i++){add(i,1);}int now=1;int nn=n; while(nn){now=(now+m-1-1)%nn+1;int l=1;int r=n;while(l<r){int mid=l+r>>1;if(sum(mid)>=now)r=mid;elsel=mid+1;}if(nn==1)break;cout<<l<<" ";add(l,-1);nn--;}
}
signed main()
{IOSint p;p=1;//cin>>p;while(p--)solve();return 0;
}

H题有时间再补吧。。。


http://www.ppmy.cn/news/1516406.html

相关文章

es相关概念、索引操作(相当于mysql中的数据库操作)

文章目录 1、概念2、索引操作&#xff08;index&#xff09;2.1、查询索引&#xff08;数据库&#xff09;2.2、创建索引&#xff08;数据库&#xff09;2.3、查看单个索引&#xff08;数据库&#xff09;2.4、删除索引&#xff08;数据库&#xff09; 1、概念 RDBMSesMongoDB…

Manim实现目标的移动和出现速度控制

一&#xff0c;介绍 缓动函数 自定义参数随时间变化的速率。 现实生活中&#xff0c;物体并不是突然启动或者停止&#xff0c; 当然也不可能一直保持匀速移动。就像我们 打开抽屉的过程那样&#xff0c;刚开始拉的那一下动作很快&#xff0c; 但是当抽屉被拉出来之后我们会不自…

【操作系统】实验:进程死锁

目录 一、实验目的 二、实验要求 三、实验步骤 四、核心代码 五、记录与处理 六、思考 七、完整报告和成果文件提取链接 一、实验目的 1掌握死锁的基本概念&#xff1b; 2理解死锁的必要条件&#xff1b; 3理解避免死锁的方法、安全状态等重要概念&#xff1b; 4了解银…

Windows环境如何安装maven并配置IDEA

运行Springboot项目时&#xff0c;出现了依赖错误&#xff0c;最后排查可能是maven安装出错了。 MAVEN版本要和IDEA版本对应&#xff0c;maven发行版本不能比idea版本高&#xff0c;可以在idea查看内置的maven版本。 点击 File–>Settings,在设置页面搜索maven&#xff0c;如…

2024牛客暑期多校训练营7 D.Interval Selection(异或哈希+双指针)

原题链接&#xff1a;D.Interval Selection 题目大意&#xff1a; 给你一个长度为 n n n 的数组 a a a&#xff0c;定义一个区间 [ l , r ] [l,r] [l,r] 内的连续子数组为好的&#xff0c;当且仅当这个子数组内的所有元素 a l , a l 1 , . . . , a r a_{l},a_{l1},...,a_{…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作&#xff1a;虚幻5|制作玩家血量&#xff0c;体力-CSDN博客 造成伤害时&#xff0c;显示暴击及暴击字体颜色和未暴击的字体颜色&#xff0c;还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量&#xff0c;命名…

Python实现贪心算法

目录 贪心算法简介贪心算法的基本思想贪心算法的应用场景活动选择问题 Python实现活动选择问题代码解释活动选择问题的解贪心算法的正确性分析贪心算法的其他应用贪心算法的局限性贪心算法的优化与变种总结 贪心算法简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一…

10天速通Tkinter库——Day7:主菜单及图鉴

本篇博客我将介绍Tkinter实践项目《植物杂交实验室》中的杂交实验室主菜单、基础植物图鉴、杂交植物图鉴、杂交植物更多信息四个页面的制作。 它们作为主窗口的子页面实例&#xff0c;除了继承主窗口的基础设置&#xff08;如图标、标题、尺寸等等&#xff09;、还可以使用主窗…

使用C++开发黑神话悟空类似3A如何避免内存泄漏

智能指针&#xff1a;使用C11或更高版本中的智能指针&#xff08;如std::unique_ptr、std::shared_ptr和std::weak_ptr&#xff09;来自动管理内存。这些智能指针在超出作用域时会自动释放它们所管理的内存。 RAII&#xff08;Resource Acquisition Is Initialization&#xf…

Java开发程序员职业发展路径

入行阶段&#xff1a;后端 3年 目标 在这一阶段&#xff0c;你将专注于后端开发&#xff0c;特别是Java编程语言及其相关技术栈。 主要任务和技能 掌握Java基础: 理解Java语言的核心概念&#xff0c;如OOP&#xff08;面向对象编程&#xff09;、数据结构、算法等。学习后端…

【Rust练习】10.元组

练习题来自&#xff1a;https://practice-zh.course.rs/compound-types/tuple.html 1 元组中的元素可以是不同的类型。元组的类型签名是 (T1, T2, …), 这里 T1, T2 是相对应的元组成员的类型. fn main() {let _t0: (u8,i16) (0, -1);// 元组的成员还可以是一个元组let _t1:…

相关性分析

斯皮尔曼、皮尔逊、肯德尔、点双列相关分析、偏相关分析、距离相关分析、双变量回归分析和互信息。 特性斯皮尔曼相关分析&#xff08;Spearman Correlation&#xff09;皮尔逊相关分析&#xff08;Pearson Correlation&#xff09;肯德尔相关分析&#xff08;Kendall’s Tau&…

华为OD题目 csv格式的数据 字符串 用C没写出来

这题对于嵌入式mcu的人来说&#xff0c;太难为了。不想解了&#xff0c;烂摆。有心情再说把。 将一个csv格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。 Comma seprated values&#xff08;CSV&#xff09;逗号分隔值&#xff0c;csv格式的数据文件使用…

nodemon学习(一)简介、安装、配置、使用

nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。以前&#xff0c;我们开发一个node后端服务时&#xff0c;每次更改文件&#xff0c;均需重启一下&#xff0c;服务才能生效。这使我们的开发效率降低了很多。nodemon的出现&#xff0c;可以…

Catf1ag CTF Crypto(六)

前言 Catf1agCTF 是一个面向所有CTF&#xff08;Capture The Flag&#xff09;爱好者的综合训练平台&#xff0c;尤其适合新手学习和提升技能 。该平台由catf1ag团队打造&#xff0c;拥有超过200个原创题目&#xff0c;题目设计注重知识点的掌握&#xff0c;旨在帮助新手掌握C…

ffmpeg.exe命令行常见应用

基本转换&#xff1a; ffmpeg -i input.mp4 output.avi将input.mp4文件转换为output.avi文件。 提取音频&#xff1a; ffmpeg -i input.mp4 -vn output.mp3从input.mp4文件中提取音频并保存为output.mp3文件。 视频剪辑&#xff1a; ffmpeg -i input.mp4 -ss 00:00:30 -t 00:…

深入探讨Java多线程

我的主页&#xff1a;2的n次方_ 1. 多线程的概念 多线程是指在同一个程序中同时执行多个线程的技术。线程是操作系统能够独立调度和执行的最小单位。在Java中&#xff0c;线程由Thread类来表示&#xff0c;所有的线程都是通过这个类或其子类来创建和控制的。通过合理的多线…

codetop标签动态规划大全C++讲解(上)!!动态规划刷穿地心!!学吐了家人们o(╥﹏╥)o

主要供自己回顾学习&#xff0c;会持续更新&#xff0c;题源codetop动态规划近半年 1.零钱兑换2.零钱兑换II3.面试题08.11.硬币4.单词拆分5.最长递增子序列6.最长递增子序列的个数7.得到山形数组的最少删除次数8.最长公共子序列9.最长重复子数组10.最长等差数列11.最大子数组和…

Docker数据卷使用手册

目录 目标 前言 概念 官方文档 匿名卷&#xff08;Anonymous Volumes&#xff09; 简介 案例 命名卷&#xff08;Named Volumes&#xff09; 简介 案例 目标 掌握Volume命令通过演示案例&#xff0c;理解数据卷种类与各自的用途。 前言 我们在很多网上教程上可以看到…

前端宝典十:webpack性能优化最佳实践

Webpack 内置了很多功能。 通常你可用如下经验去判断如何配置 Webpack&#xff1a; 想让源文件加入到构建流程中去被 Webpack 控制&#xff0c;配置 entry&#xff1b;想自定义输出文件的位置和名称&#xff0c;配置 output&#xff1b;想自定义寻找依赖模块时的策略&#xff…