首页 > 其他分享 >牛客小白月赛90题解

牛客小白月赛90题解

时间:2024-04-06 11:33:44浏览次数:23  
标签:cout int 题解 cin long 牛客 tie 90 define

A. 小A的文化节

在这里插入图片描述

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=1e5+10,mod=1e9+7;
int n,m,a[N];
void solve()
{
	cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    int res=0;
    for(int i=1;i<=m;i++)
    {
        int x;
        cin>>x;
        res+=a[x];
    }
    cout<<res;
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

B. 小A的游戏

在这里插入图片描述
有胜有负才能拉开差距,每次差距为3,判断差值是否为3的倍数即可

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=1e5+10,mod=1e9+7;
int x,y;
void solve()
{
	cin>>x>>y;
    if(abs(x-y)%3) cout<<"No\n";
    else cout<<"Yes\n";
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

C. 小A的数字

在这里插入图片描述

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=1e5+10,mod=1e9+7;
string s;
void solve()
{
	cin>>s;
    int n=s.size(),i,j;
    for(i=0;i<n;i++)//找到第一个为0的位置,i
        if(s[i]=='0')
            break;
    if(i==n)//直到末尾都没有出现0
    {
        if(s[n-1]=='1') cout<<2<<endl;//特判
        else cout<<1<<endl;
        return;
    }
    for(j=i;j<n;j++)//从第一个0开始,是0输出1,否则输出0
    {
        if(s[j]=='0') cout<<1;
        else cout<<0;
    }
    cout<<endl;
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

D. 小A的线段(easy version)

在这里插入图片描述

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=1e5+10,mod=998244353;
int n,m,a[N],st[N],ed[N],d[N],ans;
void dfs(int u,int f)//u:选第几个,f:0表示不选,1表示选
{
    if(u==m)
    {
        for(int i=1;i<=n;i++)
        {
            d[i]=d[i-1]+a[i];//用另一个数组对差分数组前缀和
            if(d[i]<2) return;//小于2,return
        }
        ans=(ans+1)%mod;// ++
        return;
    }
    dfs(u+1,0);
    a[st[u+1]]++,a[ed[u+1]+1]--;//差分
    dfs(u+1,1);
    a[st[u+1]]--,a[ed[u+1]+1]++;//回溯
}
void solve()
{
	cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>st[i]>>ed[i];
    }
    dfs(0,0),dfs(0,1);
    cout<<ans/2;//去重
    //也可以直接二进制形式枚举2^m次方次,对每种情况分别判断
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

E. 小A的任务

在这里插入图片描述
在这里插入图片描述
有k~n种选择,当i>=k时,每次花费为a类前i个+b类前i个中选k个
可以发现,一定是前i个中最小的k个

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=1e5+10,mod=1e9+7;
int n,a[N],b[N],q,k;
void solve()
{
	cin>>n>>q;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++) a[i]+=a[i-1];//前缀和
    while(q--)
    {
        cin>>k;
        int res=0,mx=1e18;
        priority_queue<int>q;//大根堆,里面元素从大到小排序
        for(int i=1;i<=k;i++) q.push(b[i]),res+=b[i];//加入k个元素,k个元素和为res
        for(int i=k;i<=n;i++)
        {
            mx=min(mx,res+a[i]);//计算min
            res-=q.top();//将队列中固定k个元素,每次减去最大的
            q.pop();//弹出最大的
            q.push(b[i+1]);//加入下一个元素
            res+=b[i+1];//更新k个元素之和
        }
        cout<<mx<<endl;//输出
    }
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

F. 小A的线段(hard version)

在这里插入图片描述
f [ l, r ]:
0~l,覆盖两次以上
l~r,覆盖一次
r~n,0次

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=1e5+10,mod=998244353;
int n,m,a[N],st,ed;
void solve()
{
    vector<pair<int,int>>v;
	cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>st>>ed;
        v.push_back({st,ed});
    }
    sort(v.begin(),v.end());//区间根据左端点排序
    map<pair<int,int>,int>f;
    f[{0,0}]=1;//定义0处覆盖两次以上
    for(int i=0;i<m;i++)
    {
        auto [L,R]=v[i];//依次选取区间[L,R]
        auto g=f;
        for(auto [it,v]:f)//对于每个区间[l,r],判断区间[L,R]
        {
            auto [l,r]=it;
            if(L<=l+1)//L<=l和L==l+1两种情况的合并
            {
                if(R<=l)//[L,R]在(l,r]左边,增加左边覆盖次数,对右边(l,r]覆盖一次无影响
                    g[{l,r}]=(g[{l,r}]+v)%mod;
                else if(R<=r)//L在(l,r]左边,R在(l,r]中,则l~R多覆盖一次->2,(R,r]一次
                    g[{R,r}]=(g[{R,r}]+v)%mod;
                else//L在(l,r]左边,R在(l,r]右边,则(l,r]多覆盖一次至2,(r,R]为1,更新区间
                    g[{r,R}]=(g[{r,R}]+v)%mod;
            }
        }
        f.swap(g);//交换map,f和g
    }
    cout<<f[{n,n}]<<endl;//[1,n]覆盖两次
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

标签:cout,int,题解,cin,long,牛客,tie,90,define
From: https://blog.csdn.net/2303_76151267/article/details/137422776

相关文章

  • BNDS 2024/4/6模拟赛题解
    T1方程描述给出非负整数\(N\),统计不定方程\(X+Y^2+Z^3=N\)的非负整数解\((X,Y,Z)\)的数量。输入输入数据,包含一个非负整数\(N\)。输出输出数据,包含一个非负整数表示解的数量。数据范围40%的数据,\(N<=10000\)60%的数据,\(N<=10^8\)100%的数据,\(N<=10^{16}\)分析......
  • 0190期基于深度学习识别是否有火焰-含数据集-含数据集
    代码下载和视频演示地址:0190期基于深度学习识别是否有火焰-含数据集_哔哩哔哩_bilibili本代码是基于pythonpytorch环境安装的。下载本代码后,有个环境安装的requirement.txt文本数据集介绍,下载本资源后,界面如下:数据集文件夹存放了本次识别的各个类别图片。本代码对数......
  • LG_B3951 [GESP样题 五级] 小杨的队列 题解
    比较简单的一道逆序对的题,甚至不用\(\Omicron(n\logn)\)的归并,只需要\(\Omicron(n^2)\)的优化冒泡。就是一个在队列里每次push一个元素,然后查找逆序对的问题。值得一提的是,这道题身高不重复,所以才能优化冒泡拿满分,不然的话就得老实用归并了。直接看代码吧。#include<b......
  • AT_xmascon21_b Bad Mood 题解
    这是一道比较简单的结论题。不难发现,最小得分为\((n+1)(m+1)-nm\),化简得到:\[\begin{aligned}&(n+1)(m+1)-nm\\=&nm+n+m+1-nm\\=&n+m+1\end{aligned}\]继续不难发现,最大得分应该是最小得分加上\(\lfloor\frac{(n-2)(m-2)+nm}{4}\rfloor\)的结果,化简,得到(忽略向下取整......
  • LG_P10183 [YDOI R1] Running 题解
    首先感谢@jjh20100730dalao提供的思路。这是一道一道简单的数学题。首先不难发现,起始时间为\(0\),那么到达每一个超市时的时间必须要能被\(v\)整除,注意到题目要求最大,所以是要求\(a_i\)的最大公因数。注意到到达每个超市的时间必须要是偶数,这样的话不满足\(v\)是最大......
  • LG_P8728 [蓝桥杯 2020 国 B] 填空问题 题解
    蓝桥杯2020国BP8728题解A题直接写Python暴力一下。Output:563故答案为\(563\)。B题直接写Python暴力一下(欸怎么又来了)。总之就是写一个DFS,枚举每一个向外走,步数\(x\)满足\(x\le2020\)的点就好啦!Output:20312088故答案为\(20312088\)。C题直......
  • 190页大型制造企业IT信息化应用集成及数字化平台建设方案(PPT)
    原文《大型制造企业IT信息化应用集成及数字化平台建设方案》PPT格式,共190页​制造企业信息化系统应用集成>总体框架总体框架制造企业信息化目标与规划>总览图移动、知识、协同、集成、智能、安全总览图制造企业信息化>集成平台整体规划lIT资源一体化l避免信息孤......
  • 牛客小白月赛90 A~D
    A-小A的文化节(Nowcoder78306A)题目大意将n个数中选定的数相加并输出。解题思路数据量很小只需int即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullpt......
  • CF1827E Bus Routes 题解
    这是一道拥有*3400标签的题目。首先很显然可以将题意中的条件转化为任意两个度数为一的节点都能通过不超过两条路径互相到达。接下来随便取一个度数大于一的节点作为根,如果\(n=2\)直接判掉即可。考虑两个叶子节点能互相到达一定需要满足什么条件,发现两个点通过一条路径能到......
  • [题解]ABC346 补题C~E
    想起上次的ABC346没打,刚才虚拟参赛打了A~D,E题思路有,但是实现方式没选好导致WA了,没能在赛时做出来。写下题解记录一下~C-Σ用求和公式先把\(1\simk\)的和求出来:\(\frac{k(k+1)}{2}\),然后对于\(A\)数组中的元素依次减去就行(注意相同元素不能减\(2\)次)点击查看代码#include<b......