NOIP2017普及组 赛前总结

  • NOIP分析
  • 算法基本概念
    • 枚举
    • 递归
    • 分治
    • 搜索
    • 动态规划
  • 算法实现
    • 枚举
    • 递归

此文写于2017年11月11日。
今天是双十一购物节,也是NOIP2017的普及组复赛。
想想过去一年里,我从“Hello ,World!”转变到算法与图论–>
BUT
今天就是NOIP:o(>﹏<)o不要啊

NOIP分析

NOIP的第一题一般是什么模拟啊,基本不会用到什么算法,如果要用算法也是用贪心枚举之类的简单算法。
NOIP的第二三四题难度不一定,所以要先读完所有题

算法基本概念

枚举

其实这个也没什么好说的,就是暴力枚举。
如果能减少循环次数更好。

递归

递归的话吧,主要是找清楚变量的关系,怎么发生的变化,以及变化成什么样。
次数比较多,可能会T,下面搜索时还会再讲。

分治

分治,故名思意,就是分开来算的意思。
切成两半就是二分,有时也可能切成四半或更多。

搜索

搜索呢有分深搜(dfs)和广搜(bfs)。
神搜就是一直往下搜索,直到找到为止。如果找不到,就回溯。一般要用到递归和记忆化。
广搜呢就是先不深入,把所有都搜索一遍。

动态规划

动态规划(DP)的题都可以用记忆化深搜来做,只不过记忆化深搜有时写起来很麻烦。而动归的代码比较简短,但是需要一些思维上的突破。

算法实现

枚举

这是一道经典枚举题:点我查看
如果要找出某个数是另一个数的两倍,我们只需要一一枚举就好了,在枚举的过程中,要避免重复运算,思想很简单,这就是枚举题。

#include
int main()
{
    int i,a[15],x,n=0,j,sum=0;
    while(scanf("%d",&x)==1)
        a[n++]=x;
    for(i=0;ifor(j=i+1;jif(a[i]*2==a[j]||a[j]*2==a[i])
                sum++;
    printf("%d",sum);
    return 0;
}

递归

递归题目:戳我
我们知道,一次只能上一阶或两阶,则

    if(n==1) return 1;
    if(n==2) return 2;
    return f(n-1)+f(n-2);

这就是f函数内部,在里面进行递归,然后达成最后的目的
如上是递归思想

#include
int f(int n)
{
    if(n==1) return 1;
    if(n==2) return 2;
    return f(n-1)+f(n-2);
}
int main()
{
    int n,i;
    while(scanf("%d",&n)!=EOF)
        printf("%d\n",f(n));
    return 0;
}

你可能感兴趣的:(小结)