牛客寒假算法集训4-总结
1.C++内存四区2.算法-排序-快速排序3.算法-排序-归并排序4.c++重载5.算法-二分6.算法—前缀和7.算法—差分8.算法-双指针9.c++引用10.c++函数默认参数及占位参数11.c++函数模板12.c++类和对象-封装13.struct和class的区别14.成员属性设置为私有15.C++类和对象-对象特性(1)16.C++类和对象-对象特性(2)17.N皇后18.动态规划dp-01背包问题19.C++类和对象-对象特性(4)20.C++类和对象-对象特性(3)21.C++友元22.C++运算符重载23.C++继承24.C++多态25.C++类模板26.C++vector容器27.C++string容器28.C++deque容器29.算法-树状数组30.算法线段树31.算法-bfs32.算法-贪心33.算法-Flood Fill34.数据结构-链表35.数据结构-栈36.数据结构-队列37.P2678 跳石头38.5132139.54440.3213241.牛客寒假算法集训1-总结42.牛客寒假算法集训2-总结43.牛客寒假算法集训3-总结44.数论-质数45.博弈论46.第十四届蓝桥杯省赛C++题解47.Trie树48.并查集49.数据结构-堆50.哈希表51.拓扑排序52.Dijkstra53.spfa54.数论-约数55.数论-欧拉函数56.图的存储和遍历
57.牛客寒假算法集训4-总结
58.牛客寒假算法集训5-总结59.牛客寒假算法集训6-总结60.Bellman_ford61.Floyd62.编辑距离63.数位dpA
思路:
签到题
AC代码:
#include <bits/stdc++.h>
using namespace std;
int a,b,k;
int main()
{
cin>>a>>b>>k;
if(a>=k*b) cout<<"good"<<endl;
else cout<<"bad"<<endl;
return 0;
}
B
思路:
博弈论
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,sum;
int a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) {cin>>a[i];sum+=a[i];}
if(sum%2==0)
{
if(n%2!=0) cout<<"gui"<<endl;
else cout<<"sweet"<<endl;
}
else
{
if(n%2!=0) cout<<"sweet"<<endl;
else cout<<"gui"<<endl;
}
return 0;
}
C
思路:
暴力模拟
时间复杂度:
O(nm+pqmax(n,m))
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int q,n,m,x,y,p;
char g[N][N];
int op[N],z[N];
void removex(int z)
{
char mp=g[z][m];
for(int i=m;i>1;i--) g[z][i]=g[z][i-1];
g[z][1]=mp;
}
void removey(int z)
{
char mp=g[n][z];
for(int i=n;i>1;i--) g[i][z]=g[i-1][z];
g[1][z]=mp;
}
int main()
{
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
cin>>p>>q;
int xx=p*q;
for(int i=1;i<=q;i++) cin>>op[i]>>z[i];
int k=1;int oo=1;
while(xx--)
{
int zx,opx;
if(k==q+1) {k=1;oo=1;}
opx=op[k++];zx=z[oo++];
if(opx==1)
{
removex(zx);
}
else
{
removey(zx);
}
}
//for(int i=1;i<=n;i++)
// for(int j=1;j<=m;j++)
// cout<<g[i][j];
cout<<g[x][y]<<endl;
return 0;
}
D
思路:
先对所有数求和,记为sum 假设这n个数的最大公约数为g,则g一定是sum的因子。 且因为这个数至少都为g,所以sum/g>=n
时间复杂度:
O(n+ ∑a)
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
map<int,int> mp;
int a[N];
int n,cnt,sum,k;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
mp[0]=1;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(mp[sum%k]) cnt++,sum=0,mp.clear(),mp[0]=1;
else mp[sum%k]=1;
}
cout<<cnt;
return 0;
}
E
思路:
从左往右选,如果有合法区间就选上,最后选中区间数就是最大了。唯一一个比较巧妙的地方是,怎么判断有没有可以和当前点组成合法区间的左端点,但这实际上也是一种比较典的思路,把所有左端点存起来,然后每读一个端点,用前缀和或者其他区间查询,检查有没有合法左端点。由于合法区间不能重叠,每次配对后,都要把前面存的左端点都删掉。
时间复杂度:
o(logn)
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
map<int,int> mp;
int a[N];
long long n,cnt,sum,k;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
mp[0]=1;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(mp[sum%k]) cnt++,sum=0,mp.clear(),mp[0]=1;
else mp[sum%k]=1;
}
cout<<cnt;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析