1. 陶陶摘苹果

来源:NOIP2005普及组 https://ac.nowcoder.com/acm/contest/233/A

解题思路:

枚举苹果,判断陶陶的身高加上凳子的高度是否大于等于苹果的高度。

代码:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int a[10];
    for (int i = 0; i < 10; i++) cin >> a[i];

    int height;
    cin >> height;
    height += 30;

    int res = 0;
    for (int i = 0; i < 10; i++)
        if (a[i] <= height)
            res++;

    cout << res << endl;

    return 0;
}

 

2. 不高兴的津津

来源:NOIP2004普及组 https://ac.nowcoder.com/acm/contest/232/A

解题思路:

枚举每一天,算出在校学习和在家学习的总时间的最大值。

C++ 代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int maxv = -1, p;
    for (int i = 1; i <= 7; i++)
    {
        int a, b;
        cin >> a >> b;
        if (a + b > maxv)
        {
            maxv = a + b;
            p = i;
        }
    }

    if (maxv > 8) printf("%d\n", p);
    else puts("0");

    return 0;
}

 

3. 校门外的树

来源:NOIP2005普及组 https://ac.nowcoder.com/acm/contest/233/B

解题思路:

用布尔数组表示每个树是否被移走。对于每个操作直接扫描区间中的所有位置即可。

C++ 代码:

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

int n, m;
bool st[N];

int main()
{
    scanf("%d%d", &m, &n);
    while (n--)
    {
        int l, r;
        scanf("%d%d", &l, &r);
        for (int i = l; i <= r; i++) st[i] = true;
    }

    int res = 0;
    for (int i = 0; i <= m; i++)
        if (!st[i])
            res++;

    printf("%d\n", res);

    return 0;
}

 

4. 花生采摘

来源:NOIP2004普及组 https://ac.nowcoder.com/acm/contest/232/B

解题思路:

阅读理解题,从题中可以发现整个过程是固定的,因此直接模拟即可。

  • 从初始状态开始,每次判断采摘下一位置的花生的时间是否够用
    • 如果够用,则采摘下一最大值;
    • 如果不够用,则停止;

C++ 代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef pair <int, int> PII; const int N = 30;

int n, m, k;
int g[N][N];

PII get_max()
{
    PII r = { 0, 0 };

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            if (g[r.first][r.second] < g[i][j])
                r = {
                    i, j
                };

    return r;
}

int main()
{
    cin >> n >> m >> k;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> g[i][j];

    auto t = get_max();
    if (t.first * 2 + 1 > k) puts("0");
    else
    {
        int res = g[t.first][t.second];
        k -= t.first + 1;
        g[t.first][t.second] = 0;

        while (true)
        {
            auto r = get_max();
            int d = abs(r.first - t.first) + abs(r.second - t.second);

            if (d + r.first + 1 > k) break;
            if (!g[r.first][r.second]) break;
            res += g[r.first][r.second];
            g[r.first][r.second] = 0;
            k -= d + 1;
            t = r;
        }

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

    return 0;
}

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