有点紧张==其实还好;
半期考试刚刚结束,noip就蹦哒蹦哒着来了:),其实还好,就是有点紧张+慌张。
一听到总结我就满脸懵逼,然后努力回想,发现——大脑中什么都没有……
说重点!
1.贪心算法(我的最爱)
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。//百度百科
其实总结起来就四个字:鼠目寸光。(没文化的都走开)
因为很简单,就少说一点
2.二分查找(套公式)
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。//百度百科
其实就是这样子
while(l+1<r)
{
int mid=(l+r)/2;
if()
l=mid;
else
r=mid;
}
或
while(l<r)
{
int mid=(l+r)/2;
if()
l=mid+1;
else
r=mid-1;
}
//注意要灵活,呵呵<(^-^)>
3.搜索(找啊找啊找朋友找到一个好朋友)
搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。//百度百科
就是往下找。
举几个栗子
深度优先搜索
如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索的实现方式可以采用递归或者栈来实现。由此可见,把通常问题转化为树的问题是至关重要的一步,完成了树的转换基本完成了问题求解。
(1)减少节点数,思想:尽可能减少生成的节点数
(2)定制回溯边界,思想:定制回溯边界条件,剪掉不可能得到最优解的子树
在很多情况下,我们已经找到了一组比较好的解。但是计算机仍然会义无返顾地去搜索比它更“劣”的其他解,搜索到后也只能回溯。为了避免出现这种情况,我们需要灵活地去定制回溯搜索的边界。
在深度优先搜索的过程当中,往往有很多走不通的“死路”。假如我们把这些“死路”排除在外,不是可以节省很多的时间吗?打一个比方,前面有一个路径,别人已经提示:“这是死路,肯定不通”,而你的程序仍然很“执着”地要继续朝这个方向走,走到头来才发现,别人的提示是正确的。这样,浪费了很多的时间。针对这种情况,我们可以把“死路”给标记一下不走,就可以得到更高的搜索效率。//百度百科//记忆化
你可能会以为我要说广度优先搜索,对不对?我偏不!!
讲讲考试技巧
1.文件输入输出
freopen(".in","r",stdin);
freopen(".out","w",stdout);
2.数组大小
a[要求+1];
3.定义变量大小
long long
4.
数据生成器
#include<cstdio>
#include<ctime>
#include<cstdlib>
int n,a[10001];
int main()
{
freopen("game.in","w",stdout);
srand(time(NULL));
n=rand()*rand()%10000;
printf("%d\n",n);
for(int i=1;i<n;i++)
printf("%d ",rand());
printf("%d",rand());
}
输出
#include<cstdio>
#include<algorithm>
using namespace std;
int n,s[10001];
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
sort(s+1,s+1+n);
for(int i=1;i<n;i++)
printf("%d ",s[i]);
printf("%d\n",s[n]);
}
半期考试刚刚结束,noip就蹦哒蹦哒着来了:),其实还好,就是有点紧张+慌张。
一听到总结我就满脸懵逼,然后努力回想,发现——大脑中什么都没有……
说重点!
1.贪心算法(我的最爱)
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。//百度百科
其实总结起来就四个字:鼠目寸光。(没文化的都走开)
因为很简单,就少说一点
2.二分查找(套公式)
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。//百度百科
其实就是这样子
while(l+1<r)
{
int mid=(l+r)/2;
if()
l=mid;
else
r=mid;
}
或
while(l<r)
{
int mid=(l+r)/2;
if()
l=mid+1;
else
r=mid-1;
}
//注意要灵活,呵呵<(^-^)>
3.搜索(找啊找啊找朋友找到一个好朋友)
搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。//百度百科
就是往下找。
举几个栗子
深度优先搜索
如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索的实现方式可以采用递归或者栈来实现。由此可见,把通常问题转化为树的问题是至关重要的一步,完成了树的转换基本完成了问题求解。
(1)减少节点数,思想:尽可能减少生成的节点数
(2)定制回溯边界,思想:定制回溯边界条件,剪掉不可能得到最优解的子树
在很多情况下,我们已经找到了一组比较好的解。但是计算机仍然会义无返顾地去搜索比它更“劣”的其他解,搜索到后也只能回溯。为了避免出现这种情况,我们需要灵活地去定制回溯搜索的边界。
在深度优先搜索的过程当中,往往有很多走不通的“死路”。假如我们把这些“死路”排除在外,不是可以节省很多的时间吗?打一个比方,前面有一个路径,别人已经提示:“这是死路,肯定不通”,而你的程序仍然很“执着”地要继续朝这个方向走,走到头来才发现,别人的提示是正确的。这样,浪费了很多的时间。针对这种情况,我们可以把“死路”给标记一下不走,就可以得到更高的搜索效率。//百度百科//记忆化
你可能会以为我要说广度优先搜索,对不对?我偏不!!
讲讲考试技巧
1.文件输入输出
freopen(".in","r",stdin);
freopen(".out","w",stdout);
2.数组大小
a[要求+1];
3.定义变量大小
long long
4.
数据生成器
#include<cstdio>
#include<ctime>
#include<cstdlib>
int n,a[10001];
int main()
{
freopen("game.in","w",stdout);
srand(time(NULL));
n=rand()*rand()%10000;
printf("%d\n",n);
for(int i=1;i<n;i++)
printf("%d ",rand());
printf("%d",rand());
}
输出
#include<cstdio>
#include<algorithm>
using namespace std;
int n,s[10001];
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
sort(s+1,s+1+n);
for(int i=1;i<n;i++)
printf("%d ",s[i]);
printf("%d\n",s[n]);
}
……