1. 数字统计

来源:NOIP2010普及组 https://ac.nowcoder.com/acm/contest/238/D

算法:枚举

复杂度:

解题思路:

直接枚举 中的每个数,再依次判断每一位是否等于 即可。

C++ 代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int N = 10010;

int main()
    {
        int l, r;
        cin >> l >> r;

        int res = 0;
        for (int i = l; i <= r; i++)
            for (int j = i; j; j /= 10)
                if (j % 10 == 2)
                    res++;

        cout << res << endl;

        return 0;

 

2. 导弹拦截

来源:NOIP2010普及组 https://ac.nowcoder.com/acm/contest/238/B

算法:枚举,排序

复杂度:

解题思路:

先用第一个雷达包围所有点,然后不断缩小第一个雷达的半径,每次圆边缘的点会从圈内出来,我们用第二个雷达去包含它 即可。

枚举半径的方法:先将所有点按到第一个雷达的距离从大到小排序,依次枚举所有点所在的圆的半径即可。

用第二个雷达去包含新点的方法:如果新点到第二个雷达的距离大于当前半径长度,则将半径更新成新的距离。

C++ 代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int N = 100010;

int n;
int a1, b1, a2, b2;

struct Point
{
    int x, y;
    int d;
    bool operator < (const Point &W) const
    {
        return d < W.d;
    }
}
point[N];

int get_dist(int x1, int y1, int x2, int y2)
{
    int dx = x1 - x2;
    int dy = y1 - y2;
    return dx *dx + dy *dy;
}

int main()
{
    scanf("%d%d%d%d", &a1, &b1, &a2, &b2);
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        point[i] = {
            x, y, get_dist(x, y, a1, b1)
        };
    }

    sort(point, point + n);
    reverse(point, point + n);

    int res = point[0].d, r = 0;
    for (int i = 1; i <= n; i++)
    {
        r = max(r, get_dist(point[i - 1].x, point[i - 1].y, a2, b2));
        res = min(res, point[i].d + r);
    }

    printf("%d\n", res);
    return 0;
}

 

3. 质因数分解

来源:NOIP2012普及组 https://ac.nowcoder.com/acm/contest/240/D

算法:枚举,数学

复杂度:

解题思路:

所有约数都是成对出现的:如果 的约数,那么 也是 的约数。

我们可以只枚举较小的约数,然后计算出较大的约数即可。那么需要枚举的范围满足: ,则 。因此只需要枚举 次。

C++ 代码:

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    for (int i = 2;; i++)
        if (n % i == 0)
        {
            cout << n / i << endl;
            break;
        }

    return 0;
}

 

4. 计数问题

来源:NOIP2013普及组 https://ac.nowcoder.com/acm/contest/241/D

算法:枚举

复杂度:

解题思路:

直接枚举 中的每个数,再依次判断每一位是否等于 即可。

C++ 代码:

#include <iostream>
using namespace std;

int main()
{
    int n, x;
    cin >> n >> x;

    int res = 0;
    for (int i = 1; i <= n; i++)
        for (int j = i; j; j /= 10)
            if (j % 10 == x)
                res++;

    cout << res << endl;

    return 0;
}

 
另外,牛客暑期NOIP真题班限时免费报名
报名链接:https://www.nowcoder.com/courses/cover/live/248
报名优惠券:DCYxdCJ