欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NOIP真题题解-普及组(模拟一)

程序员文章站 2022-03-14 16:01:44
...

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

解题思路:

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

#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

解题思路:

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

#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

解题思路:

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

  • 从初始状态开始,每次判断采摘下一位置的花生的时间是否够用

    • 如果够用,则采摘下一最大值;
    • 如果不够用,则停止;
#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;
}