目录
一.蓝桥杯简介
蓝桥杯全国软件和信息技术专业人才大赛,是由工业和信息化部人才交流中心举办的全国性IT学科赛事。大赛共包括三个竞赛组别,个人赛-软件类,个人赛-电子类,以及视觉艺术大赛。其中个人赛-软件类的比赛科目包括C/C++程序设计、Java软件开发、Python程序设计。
二.双指针
在历届中双指针这个算法出现的频率不是太高,但总归还是会考,我们想要搞好蓝桥杯应该要掌握这个算法的原理以及实际的应用。
双指针算法的核心思想是优化时间的复杂度。双指针的具体应用方式可以具体分为快慢指针与对撞指针。
三.二分法
· 二分法又叫折半查找法,原理是将一个有序的数组分为两半从中间位置开始搜索的算法,如果当前查找数据小于目标数据则将中间位置的下一位替换为左边界,如果当前查找数据大于目标数则将中间位置的上一位替换为右边界,依照上面的流程逐次查找,直至得到目标数值。时间复杂度为O(logn)。
//例题 分巧克力
//题意大概是有k个小盆友,n块巧克力,第i块巧克力有H(i)与W(i)的高度与宽度
//问你如何将巧克力分成长宽相等的巧克力分给小盆友,且巧克力越大越好。
#include<iostream>
using namespace std;
const int N=1e5+10;
int num[N][2];
int n,k;
bool check(int mid)
{
int sum=0;
for(int i=0;i<n;i++)
sum+=(num[i][1]/mid)*(num[i][0]/mid);
if(sum>=k)
return true;
else
return false;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>num[i][0]>>num[i][1];
}
int l=0,r=100000,max=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))//长宽为mid的巧克力是否满足小盆友的需要
{
max=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<max<<endl;
return 0;
}
四.dfs(深度优先搜索)
深度优先搜索是一种一条路走到底的搜索方式,利用了递归的原理。
如图,深度优先搜索的步骤是从左到右,从上到下的开始进行数组的遍历与查找来实现查找最优方式的一种算法,大致流程是从1开始查找,向左下查找直至到尽头,再返回上一级开始向右下开始查找直到尽头,如此往复,直至查完整个数组。
//例题 分糖果
//题意大概是有两种糖果分别是16个与9个,要分给7个小盆友,每个人最少2个最多5个
//问你有几种分法
#include<iostream>
using namespace std;
typedef long long ll;
ll num=0;
void dfs(int x,int y,int z)
{
if(x>=7)
{
if(y==0&&z==0)
num++;
return ;
}
for(int i=0;i<=y;i++)
{
for(int j=0;j<=z;j++)
{
if(i+j>=2&&i+j<=5)
dfs(x+1,y-i,z-j);
}
}
return ;
}
int main()
{
dfs(0,9,16);
cout<<num<<endl;
return 0;
}
五.总结
总结了这段时间里的一些微末的见解,希望能在此基础上提升我算法的能力,早日弥补这个短板。如果能够你带来一点帮助我感到不胜荣幸。