2026第六次萌新赛
C-报数_河南萌新联赛2026第(六)场:郑州大学
题目中给了两个公式,a1=1,根据第二个公式,可以推出来后面都是1,由于输入的正整数很大,需要用字符串输入,后面都输出1就可以了。
#include<bits/stdc++.h>
using namespace std;
int main(){
string n;;
cin>>n;
cout<<1;
return 0;
}
G-找不同_河南萌新联赛2026第(六)场:郑州大学
只要输出一组有序对数就可以了,用for循环找出两个不同的字母对数,输出他们的下标,找出一个就 break,没有找到就输出-1。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
string s;
cin>>s;
bool ok=0;
for(int i=0;i<s.size();i++){
for(int j=i;j<n;j++){
if(s[i]!=s[j]){
ok=1;
cout<<i<<" "<<j;
break;
}
}
if(ok==1){
break;
}
}
if(ok==0){
cout<<-1;
}
return 0;
}
J-空调_河南萌新联赛2026第(六)场:郑州大学
先依次找出,到达温度t的次数 a,到达模式 m 的次数 b,他们求和 c,给的次数n用掉 c后还剩的次数 d,只要给的次数不够 c用,那么就是再说谎,如果够用并且还剩下偶数次,可以通过温度+1,-1来消耗掉,如果是奇数次,那看次数还能不能到达最值,然后再回来,在最值的时候消耗掉次数,如果最高点k是奇数,并且还能在不超过n的情况下多走一圈的模式,那么就是可能,其他的情况就是说谎。
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int t;
cin>>t;
while(t--){
int l,r,k,n,t,m;
cin>>l>>r>>k>>n>>t>>m;
int a=abs(t-26);
int b=m-1;
int c=a+b;
int d=n-c;
if(c>n){
cout<<"Lie"<<endl;
}
else if(d%2==0){
cout<<"Maybe"<<endl;
}
else if(n>r-26+r-t+m-1||n>26-l+t-l+m-1){
cout<<"Maybe"<<endl;
}
else if(k%2==1&&n>=c+k){
cout<<"Maybe"<<endl;
}
else{
cout<<"Lie"<<endl;
}
}
return 0;
}
D-垂直电梯_河南萌新联赛2026第(六)场:郑州大学
电梯换乘求费用总和,如果是n的因数或者倍数,那么就不用换乘,如果不是的话,就需要换乘,一次电梯就能到达,1是所有数字的因数,那么就可以换成到1之后再去b,最少要两次电梯
a
=
x
0
,
b
=
x
k
s
=
m
+
(
x
1
−
x
0
)
+
m
+
(
x
2
−
x
1
)
+
m
(
x
3
−
x
2
)
+
.
.
.
+
m
+
(
x
k
−
x
k
−
1
)
s
=
m
∗
k
+
a
−
b
k
表示坐电梯的次数,找到最少的次数就能找到最少的换乘费用和
a=x_0,b=x_k\\s=m+(x_1-x_0)+m+(x_2-x_1)+m(x_3-x_2)+...+m+(x_k-x_k-1)\\s=m*k+a-b\\k表示坐电梯的次数,找到最少的次数就能找到最少的换乘费用和
a=x0,b=xks=m+(x1−x0)+m+(x2−x1)+m(x3−x2)+...+m+(xk−xk−1)s=m∗k+a−bk表示坐电梯的次数,找到最少的次数就能找到最少的换乘费用和
#include<bits/stdc++.h>
using namespace std;
#define int long long
int gcd(int a,int b){
while(b!=0){
int t=a%b;
a=b;
b=t;
}
return a;
}
int lcm(int a,int b){
int a1=a/gcd(a,b);
int b1=b*a1;
return a/gcd(a,b)*b;
}
signed main(){
int t;
cin>>t;
while(t--){
int n,m,a,b;
cin>>n>>m>>a>>b;
if(lcm(a,b)<=n||gcd(a,b)>1){
cout<<m+b-a<<endl;
continue;
}
cout<<2*m+b-a<<endl;
}
return 0;
}
最大公因数自定义函数
(库函数__gcd(a,b))
int gcd(int a,int b){
while(b != 0){ // b不等于0就循环
int t = a % b; // 取余数
a = b; // b赋值给a
b = t; // 余数赋值给b
}
return a; // b为0时,a就是最大公因数
}
最小公倍数公式
l c m ( a , b ) = a / g c d ( a , b ) ∗ b lcm(a,b)=a/gcd(a,b)*b lcm(a,b)=a/gcd(a,b)∗b
B-果树_河南萌新联赛2026第(六)场:郑州大学
数组下标从0开始,只摘偶数编号的苹果,最多只能反转一次区间,只有长度为偶数的个数才能有效反转,可以分两类情况,偶起点奇终点、奇终点偶起点,把他们之间相邻的增加或者减少的数各自放在一个数组里。先求出不反转的所有偶数的和,再找到那两类的最大字段和,最终答案是原始所有偶数和加上两类字段和的较大值。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[100005];
signed main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int sum=0;
for(int i=0;i<n;i+=2){
sum=sum+a[i];
}
vector<int>v;
vector<int>ve;
for(int i=0;i<n-1;i+=2){
int v1=a[i+1]-a[i];
v.push_back(v1);
}
for(int i=1;i<n-1;i+=2){
int v2=a[i]-a[i+1];
ve.push_back(v2);
}
int sum1=0;
int ans1=0;
for(int i=0;i<v.size();i++){
sum1=max(sum1+v[i],v[i]);
ans1=max(ans1,sum1);
}
int sum2=0;
int ans2=0;
for(int i=0;i<ve.size();i++){
sum2=max(sum2+ve[i],ve[i]);
ans2=max(ans2,sum2);
}
int ans=sum+max(ans1,ans2);
cout<<ans;
}
L-神秘数字_河南萌新联赛2026第(六)场:郑州大学
二进制
本题需要构造最少数量的数字集合,依靠每个数字对于各个集合 “是或否” 的回答得到唯一的 01 序列,从而唯一确定神秘数字,最少集合数目 m 为满足2的 m次方大于等于 n的最小整数,利用二进制编码思想,将每一个二进制位对应一个集合,遍历 1 到 n 所有数字,把二进制第 i 位为 1 的数字放入第 i+1 个集合,每个数字的 m 条回答恰好对应自身二进制编码,保证所有数字的回答序列互不相同,最后输出集合数量以及每个集合的大小与内部元素。
二进制相关代码片段
//外层循环:遍历每一个二进制位,i代表当前处理第i位(从0开始的最低位)
for(int i=0;i<m;i++){
//遍历题目全部真实数字1~n
for(int j=1;j<=n;j++){
// j >> i :把数字j的二进制整体向右移动i位,让第i位移到二进制最末尾
// &1 :取出移位之后最末尾的二进制位,结果只能是0或者1
// 如果等于1,代表数字j的二进制第i位是1,把j加入当前集合v[i+1]
if((j>>i)&1){
v[i+1].push_back(j);
}
}
}
j >> i:右移 i 位,将数字的第 i 个二进制位移到最右侧,方便读取;&1:按位与 1,只保留最右侧 1 个 bit,用来判断该位是 1 还是 0;- 判断为真就把该数字放进对应集合,数字在不在这个集合,就等价于该二进制位是 1 还是 0;
- m 个集合对应 m 个二进制位,每个数字得到独一无二的 01 回答序列,实现区分所有数字。
#include<bits/stdc++.h>
using namespace std;
vector<int>v[20];
int main(){
int n;
cin>>n;
int m=1;
while((1<<m)<n){//2的m次方
m++;
}
cout<<m<<endl;
for(int i=0;i<m;i++){
for(int j=1;j<=n;j++){
if((j>>i)&1){
v[i+1].push_back(j);
}
}
}
for(int i=1;i<=m;i++){
cout<<v[i].size()<<" ";
for(auto x:v[i]){
cout<<x<<" ";
}
cout<<endl;
}
}
I-耳鸣_河南萌新联赛2026第(六)场:郑州大学
统计网格中至少被任意一个耳鸣圆形区域覆盖的格子总数,圆满足欧几里得距离条件 (dx2+dy2 < a2)。圆形不是规整矩形,不能直接使用二维差分,因此采用逐行拆解 + 一维扁平化差分的方法。
- 遍历圆涉及的每一行:对于每个圆心((x,y)),圆只会影响行号 (
[x-a,x+a]),同时裁剪到地图合法行范围([1,n])。 - 计算本行覆盖的列区间
- dx:当前行与圆心行的竖直距离;
- 根据圆方程变形得到 (dy2<=a2-dx2),算出本行水平方向最大合法偏移
len; - 修正
sqrt()带来的浮点精度误差,得到准确的len; - 算出本行被圆覆盖的列区间([l,r]),裁剪边界保证不超出地图列([1,m])。
- 一维扁平化差分标记区间:将二维坐标映射成一维下标,对本行区间([l,r])执行一维差分:起点
pl加 1,终点下一位pr_1=r+1减 1,O (1) 完成区间标记。 - 前缀和还原统计答案:全部查询处理完毕,遍历整个扁平化一维数组,累加差分得到每个格子真实被覆盖次数
pre;统计pre>0的格子数量,即为至少被一个耳鸣圆覆盖的位置总数,输出答案。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,a,q;
cin>>n>>m>>a>>q;
vector<int>diff(m*n+3,0);
for(int i=0;i<q;i++){
int x,y;
cin>>x>>y;
for(int j=max(1,x-a);j<=min(n,x+a);j++){
int dx=abs(x-j);
int dy2=a*a-dx*dx;
int len=(int)sqrt(dy2);
while((len+1)*(len+1)<=dy2){
len++;
}
int l=max(1,y-len);
int r=min(m,y+len);
int pl=(j-1)*m+l;
int pr_1=(j-1)*m+r+1;
diff[pl]++;
diff[pr_1]--;
}
}
int ans=0,pre=0;
for(int i=1;i<=n*m;i++){
pre+=diff[i];
if(pre>0){
ans++;
}
}
cout<<ans;
}

391

被折叠的 条评论
为什么被折叠?



