NOIP2013提高组初赛难点整理

选择题

  1. 斐波那契数列的定义如下: F 1 = 1 , F 2 = 1 , F n = F n − 1 + F ( n − 2 ) ( n ≥ 3 ) F_1 = 1, F_2 = 1, F_n = F_{n - 1} + F_(n - 2) (n \ge 3) F1=1,F2=1,Fn=Fn1+F(n2)(n3)。如果用下面的函数计算斐波那契数列的第 n 项,则其时间复杂度为( )。
int F(int n){
    
    
    if (n <= 2)
        return 1;
    else
        return F(n - 1) + F(n - 2);
}

【解析】排除法,递归调用求斐波那契数列第 n n n项。该题的递归调用树为二叉树,调用次数即二叉树的结点个数。所以时间复杂度接近 O ( 2 n ) O(2^n) O(2n),因此排除 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2)
具体推导过程,可以参考这篇博文

问题求解

  1. 现有一只青蛙,初始时在 n n n 号荷叶上。当它某一时刻在 k k k 号荷叶上时,下一时刻将等概率地随机跳到 1 , 2 , … , k 1, 2, …, k 1,2,,k号荷叶之一上,直至跳到 1 1 1 号荷叶为止。当 n = 2 n = 2 n=2 时,平均一共跳 2 2 2 次;当 n = 3 n = 3 n=3 时,平均一共跳 2.5 2.5 2.5次。则当 n = 5 n = 5 n=5 时,平均一共跳()次。

【解析】f(n)表示从1号荷叶跳到n号荷叶的平均次数,那么:

  • f ( 1 ) = 0 f(1) = 0 f(1)=0
  • f ( 2 ) = 1 2 × ( f ( 1 ) + 1 ) + 1 2 × ( f ( 2 ) + 1 ) f(2) = \frac{1}{2}\times(f(1) + 1) + \frac{1}{2}\times(f(2) + 1) f(2)=21×(f(1)+1)+21×(f(2)+1) 1 2 \frac{1}{2} 21的概率从1号荷叶跳1次过来, 1 2 \frac{1}{2} 21的概率从2号荷叶跳1次过来, f ( 2 ) = 2 f(2)=2 f(2)=2
  • f ( 3 ) = 1 3 × ( f ( 1 ) + 1 ) + 1 3 × ( f ( 2 ) + 1 ) + 1 3 × ( f ( 3 ) + 1 ) f(3) = \frac{1}{3}\times(f(1) + 1) + \frac{1}{3}\times(f(2) + 1)+ \frac{1}{3}\times(f(3) + 1) f(3)=31×(f(1)+1)+31×(f(2)+1)+31×(f(3)+1) 1 3 \frac{1}{3} 31的概率从1号荷叶跳1次过来, 1 3 \frac{1}{3} 31的概率从2号荷叶跳1次过来, 1 3 \frac{1}{3} 31的概率从3号荷叶跳1次过来, f ( 3 ) = 5 2 f(3)=\frac{5}{2} f(3)=25
  • f ( 4 ) = 1 4 × ( f ( 1 ) + 1 ) + 1 4 × ( f ( 2 ) + 1 ) + 1 4 × ( f ( 3 ) + 1 ) + 1 4 × ( f ( 4 ) + 1 ) f(4) = \frac{1}{4}\times(f(1) + 1) + \frac{1}{4}\times(f(2) + 1)+ \frac{1}{4}\times(f(3) + 1)+ \frac{1}{4}\times(f(4) + 1) f(4)=41×(f(1)+1)+41×(f(2)+1)+41×(f(3)+1)+41×(f(4)+1) 1 4 \frac{1}{4} 41的概率从1号荷叶跳1次过来, 1 4 \frac{1}{4} 41的概率从2号荷叶跳1次过来, 1 4 \frac{1}{4} 41的概率从3号荷叶跳1次过来, 1 4 \frac{1}{4} 41的概率从4号荷叶跳1次过来, f ( 4 ) = 17 6 f(4)=\frac{17}{6} f(4)=617
  • f ( 5 ) = 1 5 × ( f ( 1 ) + 1 ) + 1 5 × ( f ( 2 ) + 1 ) + 1 5 × ( f ( 3 ) + 1 ) + 1 5 × ( f ( 4 ) + 1 ) + 1 5 × ( f ( 5 ) + 1 ) f(5) = \frac{1}{5}\times(f(1) + 1) + \frac{1}{5}\times(f(2) + 1)+ \frac{1}{5}\times(f(3) + 1)+ \frac{1}{5}\times(f(4) + 1)+ \frac{1}{5}\times(f(5) + 1) f(5)=51×(f(1)+1)+51×(f(2)+1)+51×(f(3)+1)+51×(f(4)+1)+51×(f(5)+1),所以 f ( 5 ) = 38 12 f(5) = \frac{38}{12} f(5)=1238

阅读程序

#include <iostream>
#include <cstring>
using namespace std;
const int SIZE = 100;
int n, m, p, a[SIZE][SIZE], count;
void colour(int x, int y){
    
    
    count++;
    a[x][y] = 1;
    if ((x > 1) && (a[x - 1][y] == 0)) colour(x - 1, y);
    if ((y > 1) && (a[x][y - 1] == 0)) colour(x, y - 1);
    if ((x < n) && (a[x + 1][y] == 0)) colour(x + 1, y);
    if ((y < m) && (a[x][y + 1] == 0)) colour(x, y + 1);
}
int main(){
    
    
    int i, j, x, y, ans;
    memset(a, 0, sizeof(a));
    cin>>n>>m>>p;
    for (i = 1;i <= p;i++) {
    
    
        cin>>x>>y;
        a[x][y] = 1;
    }
    ans = 0;
    for (i = 1;i <= n;i++)
        for (j = 1;j <= m;j++)
            if (a[i][j] == 0) {
    
    
                count = 0;
                colour(i, j);
                if (ans < count)
                    ans = count;
            }
    cout<<ans<<endl;
    return 0;
}

输入:
6 5 9
1 4
2 3
2 4
3 2
4 1
4 3
4 5
5 4
6 4

【解析】深度优先遍历,求连通块的大小。注意求到矩阵的第m列即可。

猜你喜欢

转载自blog.csdn.net/qiaoxinwei/article/details/108290106