编程语言
首页 > 编程语言> > 2021 年百度之星·程序设计大赛 - 初赛三

2021 年百度之星·程序设计大赛 - 初赛三

作者:互联网

网址:Contest Problem List (hdu.edu.cn)

1001签到题判断取得的平均数是否在最大值和最小值之间,但是题目并未保证输入最大值一定比最小值大,并且未发现该问题,导致不断的WA,需要加以判断。
1002DFS深搜模板提就是简单的表格路径深度搜索,只需要将走过的路径设置为不可通过,调用两次深度搜索的方法即可,并且行进的路径只能是向右以及向下。问题中居然未保证起始点和终止点一定是可以行走的。
1003
1004DFS深搜+ 打表将问题转换成搜索的问题,由于数据量比较小只有80,将在线计算的结果保存到数组中变成离线的问题即可,然后根据输入判断取出值即可。

由于第一道签到题存在的坑点迟迟未发现,导致三个小时的比赛变成了一个半小时,其中很大部分时间都在考虑为什么这么简单的签到题却不能A掉呢。共计AC两道,罚时5次。

1001

该题为一个签到题,判断最后的均值是否在最大值和最小值之间即可。一道极为自闭的题目。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        ll n, max_, min_, ave_;
        scanf("%lld%lld%lld%lld", &n, &max_, &min_, &ave_);
        max_ = max_ + 100;
        min_ = min_ + 100;
        ave_ = ave_ + 100;
        if(n == 1)
        {
            if(max_ == min_ && max_ == ave_)
            {
                cout << "yes" << endl;
            }
            else
            {
                cout << "no" << endl;
            }

        }
        else if(n == 2)
        {
            if(max_ + min_ == ave_ * 2 && max_ >= min_)
            {
                cout << "yes" << endl;
            }
            else
            {
                cout << "no" << endl;
            }
        }
        else if(n >= 3)
        {

            ll sum = n * ave_;
            sum = sum - max_;
            sum = sum - min_;

            //if(ans >= min_ * 1.0 && ans <= max_)
            if(sum >= min_ * (n - 2) && sum <= max_ * (n - 2))
            {
                cout << "yes" << endl;
            }
            else
            {
                cout << "no" << endl;
            }
        }
    }
    return 0;
}

 1002

 该题就是简单的DFS深搜,由于路径的数目最多只能为2,所以只有0,1,2的情况,将写好的DFS代码执行两次,其中将走过的路径转换为不可行进,即可获得答案。其中起点和终点未保证一定是可以行进的。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 15;
int vis[maxn][maxn];
char str[maxn][maxn];
int ans;

void DFS(int x, int y, int n, int &k)
{
    //printf("%d   %d\n", x, y);
    if(x == n-1 && y == n-1)
    {
        vis[x][y] = 0;
        k = 1;
        ans ++;
        //cout << ans << endl;
        return;
    }
    int x1 = x + 1;
    int y1 = y;
    int x2 = x;
    int y2 = y + 1;
    if(x1 < n && y1 < n && vis[x1][y1] == 0)
    {
        vis[x1][y1] = 1;
        DFS(x1, y1, n, k);
        if(k == 1)
            return;
    }
    if(x2 < n && y2 < n && vis[x2][y2] == 0)
    {
        vis[x2][y2] = 1;
        DFS(x2, y2, n, k);
        if(k == 1)
            return;
    }
    return;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%s", str[i]);
        }
        memset(vis, 0, sizeof(vis));

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(str[i][j] == '.')
                {
                    vis[i][j] = 0;
                }
                else if(str[i][j] == '#')
                {
                    vis[i][j] = 1;
                }
            }
        }
        if(vis[0][0] == 1 || vis[n-1][n-1] == 1)
        {
            cout << 0 << endl;
        }
        else
        {
            /*
            for(int i = 0; i<n ; i++)
            {
                for(int j=0; j<n; j++)
                {
                    printf("%d ", vis[i][j]);
                }
                printf("\n");
            }
            */
            int k = 0;
            ans = 0;
            DFS(0, 0, n, k);
            /*
            for(int i = 0; i<n ; i++)
            {
                for(int j=0; j<n; j++)
                {
                    printf("%d ", vis[i][j]);
                }
                printf("\n");
            }
            */
            k = 0;
            DFS(0, 0, n, k);
            /*
            for(int i = 0; i<n ; i++)
            {
                for(int j=0; j<n; j++)
                {
                    printf("%d ", vis[i][j]);
                }
                printf("\n");
            }
            */
            cout << ans << endl;
        }

    }
    return 0;
}

1003 

1004 

该题目分为两部分进行, 因为使用在线计算的情况会超时,并且查询量较小只有80个, 故所以我们离线在本地计算好结果好保存到数组中,然后提交在线查询,根据查询在数组中取出对应值即可。

代码段一为在线的方法,计算出每个值对应的结构。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100;
int vis[maxn];
int ans;
int sum[maxn];

void DFS(int s, int k, int n)
{
    if(k == n)
    {
        ans++;
        return;
    }
    int r = (s + k + n) % n;
    if(r == 0)
        r = n;
    int l = (s - k + n) % n;
    if(l == 0)
        l = n;

    if(vis[r] == 0)
    {
        vis[r] = 1;
        DFS(r, k+1, n);
        vis[r] = 0;
    }
    if(vis[l] == 0)
    {
        vis[l] = 1;
        DFS(l, k+1, n);
        vis[l] = 0;
    }
    return;
}

int main()
{
    int t, n;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        memset(vis, 0, sizeof(vis));
        ans = 0;

        vis[1] = 1;
        DFS(1, 1, n);
        cout << ans << endl;
    }
    return 0;
}

 代码段二,将结构保存至数组中,直接取出对应的值即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;

int main()
{
    int sum[80] = {1, 2, 2, 4, 2, 4, 4, 8, 2, 4, 6, 8, 2, 8, 6, 16, 2, 4, 6, 8, 4, 12, 6, 16, 4, 4, 4, 16, 2, 12, 10, 32, 4, 4, 8, 8, 2, 12, 6, 16, 2, 8, 6, 24, 6, 12, 8, 32, 6, 8, 6, 8, 2, 8, 10, 32, 4, 4, 6, 24, 2, 20, 6, 64, 6, 8, 8, 8, 4, 16, 6, 16, 2, 4, 8, 24, 14, 12, 6, 32};
    int t, n;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        cout << sum[n-1] << endl;
    }
    return 0;
}

标签:min,int,sum,初赛,vis,maxn,2021,ans,之星
来源: https://blog.csdn.net/jiangchao98/article/details/119489955