2026牛客寒假算法基础集训营4(A B C I H F G)

依旧开场叠罚时😭😭

A 本场比赛灵感来源于树状数组出题组

思路:

首先计算以下 n − 1 n-1 n−1 个数的 80 % 80\% 80% 是多少,然后从第一个数到最后一个数遍历,然后再遍历一个循环。
代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=2e3+5;
int a[N];
void solve()
{
    int n;
    cin>>n;
    int ans=0;
    int ttt=(4*(n-1)+4)/5;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=0;i<n;i++)
    {
        int cnt=0;
        for(int j=0;j<n;j++)
        {
            if(a[j]<=a[i])cnt++;
        }
        if((cnt-1)>=ttt)ans+=a[i];
    }
    cout<<ans;
}
signed main(){
	IOS
	int t=1;
	while(t--)
	{
		solve();
	}
}

B 构造部落

思路:

记录一下每个首领登基的年份。
代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=2e5+5;
int a[N];
int year[N];
void solve()
{
    int n,q,s;
    cin>>n>>q>>s;
    year[1]=s;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        year[i+1]=year[i]+a[i];
    }
    while(q--)
    {
        int x,y;
        cin>>x>>y;
        cout<<year[x]+y-1<<endl;
    }
}
signed main(){
	IOS
	int t=1;
	while(t--)
	{
		solve();
	}
}

C 墨提斯的排列

思路:

要让相邻两项异或值最小,就需要二进制表示只有一位二进制数不同,这种任意两个相邻的代码只有一位二进制数不同的编码称为格雷码。
代码:

cpp 复制代码
void solve()
{
    int n;
    cin>>n;
    for(int i=0;i<(1<<n);i++)
    {
        cout<<(i^(i>>1))<<" ";
    }
}

I 初华的扭蛋机

思路:

谨记不要赌博,所以我一个都不押。
代码:

cpp 复制代码
void solve()
{
    cout<<"######";
}

H 时不时使使用玉米加农炮掩饰害羞的邻座艾莉同学

思路:

这个的话我刚开始感觉是二维前缀和,不过这个图形是个菱形。手画一下,定义一下偏移量数组,用 sc 数组表示该点的得分。记录最大值和对应坐标。每次添加时只遍历地图中的 5 ∗ 5 5*5 5∗5 范围,满足曼哈顿距离的加分,然后不断更新最大值。

还是注意开 longlong

复制代码
○ ○ ● ○ ○ 
○ ● ● ● ○ 
● ● ● ● ● 
○ ● ● ● ○ 
○ ○ ● ○ ○ 

代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=550;
int a[N][N];
int sc[505][505];
int dx[13]={-2,-1,-1,-1,0,0,0,0,0,1,1,1,2};
int dy[13]={0,-1,0,1,-2,-1,0,1,2,-1,0,1,0};
void solve()
{
    int n,m,q;
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
        }
    }
    int ansx,ansy,ma=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int cnt=0;
            for(int d=0;d<13;d++)
            {
                int xx=i+dx[d];
                int yy=j+dy[d];
                if(xx>0&&yy>0&&xx<=n&&yy<=m)
                {
                    cnt+=a[xx][yy];
                }
            }
            sc[i][j]=cnt;
            if(sc[i][j]>ma){
                ma=sc[i][j];
                ansx=i;
                ansy=j;
            }
        }
    }
    while(q--)
    {
        int x,y,z;
        cin>>x>>y>>z;
        a[x][y]+=z;
        for(int i=max(1LL,x-2);i<=min(n,x+2);i++)
        {
            for(int j=max(1LL,y-2);j<=min(m,y+2);j++)
            {
                if(abs(i-x)+abs(j-y)<=2)
                {
                    sc[i][j]+=z;
                    if(sc[i][j]>ma)
                    {
                        ansx=i;
                        ansy=j;
                        ma=sc[i][j];
                    }
                }
            }
        }
        cout<<ansx<<" "<<ansy<<endl;
    }
}
signed main(){
	IOS
	int t=1;
	while(t--)
	{
		solve();
	}
}

F 爱音的01串构造

思路:

赛时就想着交替分布了,没想到均匀分布。:将数量较少的字符作为分隔符,数量较多的字符分成尽可能均匀的段。
代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define int long long
#define endl '\n'
void solve()
{
    int a,b;
    cin>>a>>b;
    int n=a+b;
    string s;
    if(a==0){
        cout<<string(b,'1')<<endl;
        return;
    }
    if(b==0){
        cout<<string(a,'0')<<endl;
        return;
    }
    if(a>=b){
        string tt(n,'0');
        s=tt;
        int d=a/(b+1);//每组至少有d个0
        int res=a%(b+1);//前res组每组多一个0
        for(int i=d;i<n;i+=d+1)//在字符串中每隔(d+1)个位置放一个1
        {
            if(res>0)//多放一个0
            {
                res--;
                i++;
            }
            s[i]='1';
        }
    }else{
        int d=b/(a+1);
        int res=b%(a+1);
        string tt(n,'1');
        s=tt;
        for(int i=d;i<n;i+=d+1)
        {
            if(res>0)
            {
                res--;
                i++;
            }
            s[i]='0';
        }
    }
    cout<<s<<endl;
}
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
}

G 真白的幻觉

思路:

表示拒绝补这个题,还真有人用 bfs 做出来了。
代码:

cpp 复制代码
void solve()
{
    cout<<"277777788888899 27777789999999999";
}
相关推荐
变量未定义~1 小时前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗1 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH1 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜1 小时前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu1 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月1 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基2 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana22 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
陈天伟教授2 小时前
暴力美学-大型语言模型与涌现:一个复杂系统视角
人工智能·算法