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