2026第六次萌新赛

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+(x1x0)+m+(x2x1)+m(x3x2)+...+m+(xkxk1)s=mk+abk表示坐电梯的次数,找到最少的次数就能找到最少的换乘费用和

#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);
        }
    }
}
  1. j >> i:右移 i 位,将数字的第 i 个二进制位移到最右侧,方便读取;
  2. &1:按位与 1,只保留最右侧 1 个 bit,用来判断该位是 1 还是 0;
  3. 判断为真就把该数字放进对应集合,数字在不在这个集合,就等价于该二进制位是 1 还是 0;
  4. 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)。圆形不是规整矩形,不能直接使用二维差分,因此采用逐行拆解 + 一维扁平化差分的方法。

  1. 遍历圆涉及的每一行:对于每个圆心((x,y)),圆只会影响行号 ([x-a,x+a]),同时裁剪到地图合法行范围([1,n])。
  2. 计算本行覆盖的列区间
    • dx:当前行与圆心行的竖直距离;
    • 根据圆方程变形得到 (dy2<=a2-dx2),算出本行水平方向最大合法偏移len
    • 修正sqrt()带来的浮点精度误差,得到准确的len
    • 算出本行被圆覆盖的列区间([l,r]),裁剪边界保证不超出地图列([1,m])。
  3. 一维扁平化差分标记区间:将二维坐标映射成一维下标,对本行区间([l,r])执行一维差分:起点pl加 1,终点下一位pr_1=r+1减 1,O (1) 完成区间标记。
  4. 前缀和还原统计答案:全部查询处理完毕,遍历整个扁平化一维数组,累加差分得到每个格子真实被覆盖次数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值