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

题目链接网址:Contest Problem List (hdu.edu.cn)

1001 是一道图上操作问题,求概率,比赛时未读题,日后有时间再补题,图上操作代码水平下降极为厉害
1003

全场第四easy题目,读完题发现是DP题,果断放弃,DP一直处于弱项,需要不断加强训练学习

1004 签到题,推导一下后即为求一个数的除1以外的最小因子, 但是未考虑到给出a, b两个数字可能出现相同的情况,T掉1次,WA掉2次后才解决问题
1006 一道贪心的算法题,维护最左侧的第一个和第二个连续的最大值即可,比赛时使用优先队列的方法导致T, 补题时使用数组重新A掉
1008 相当于构建一个环形,判断环形是否会到达某一点, 1A

在很久未做算法题后,参加一两次比赛检验一下退化的水平,长时间写python代码后导致写C++代码稍有不适。做题过程中,  代码能力下降厉害,思路也不如以往。其中1006一道较为擅长的贪心题最终却未能AC。每次遇到DP的题目均直接放弃,痛定思痛,决定彻底学习一下DP的算法。AC两道, 罚时3次。

1003

1004

 签到题, 通过列数学等式可知:x * c + z = a,   y * c + z = b, 该题即判断abs(a - b)之后因子的最大值和除一之外的最小值。将特殊情况,a = b 考虑清楚即可。

AC代码:

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

int main()
{
    ll a, b, T;
    scanf("%lld", &T);
    while(T--)
    {
        scanf("%lld%lld", &a, &b);
        ll max_, min_;
        if(a > b)
        {
            max_ = a;
            min_ = b;
        }
        else
        {
            max_ = b;
            min_ = a;
        }
        ll c_max = -1, c_min = -1;
        c_max = max_ - min_;
        ll k = max_ - min_;
        for(ll i=2; i<= ll(sqrt(k * 1.0)) + 1; i++)
        {
            if(k % i ==0)
            {
                c_min = i;
                break;
            }
        }
        if(k >= 2 && c_min == -1)
        {
            c_min = k;
        }
        if(max_ == min_ && max_ >= 2)
        {
            c_max = max_;
            c_min = 2;
        }
        if(c_max != -1 && c_min != -1)
        {
            printf("%lld %lld\n", c_min, c_max);
        }
        else
            printf("-1 -1\n");
    }
    return 0;
}

1006

1008

 可以将图中的问题构建成一个矩阵的形式表示成一个环形,然后根据环形的起点,判断是否会最后击杀狼人。问题即可解决1A。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 55;
int T, n;
int val[maxn];
int die[maxn];
int vis[maxn][maxn];

int main()
{
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        memset(die, 0, sizeof(die));
        memset(val, 0, sizeof(val));
        memset(vis, 0, sizeof(vis));
        int k = 0;
        bool win = false;
        for(int i=1; i<=n; i++)
        {
            scanf("%d", &val[i]);
            if(val[i] == 1)
            {
                k = i;
            }
        }/*
        for(int i=1; i<=n; i++)
        {
            printf("%d ", val[i]);

        }
        printf("\n");*/
        for(int i = 1; i<= n; i++)
        {
            for(int j = 1; j<= n; j++)
            {
                scanf("%d", &vis[i][j]);
            }
        }/*
        for(int i=1; i<= n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                printf("%d ", vis[i][j]);
            }
            printf("\n");
        }*/

        int count_ = 0;
        for(int i=1; i<=n; i++)
        {
            int num = vis[k][i];
            if(num != k && die[num] == 0)//狼人杀人
            {
                int out = num; //被杀猎人
                die[num] = 1;
                //cout << out << endl;
                count_++;
                int out_k;
                while(out)
                {
                    int con = 0;
                    for(int i=1; i<=n; i++)
                    {
                        out_k = vis[out][i];
                        if(out_k == k)//狼人被击杀
                        {
                            win = false;
                            con = 1;
                            break;
                        }
                        if(out_k != k && die[out_k] == 0)//猎人被击杀
                        {
                            die[out_k] = 1;
                            count_++;
                            out = out_k;
                            //cout << out << endl;
                            break;
                        }
                    }
                    //cout << "   " << count_ << endl;
                    if(count_ >= n - 2)
                    {
                        win = true;
                        con = 1;
                    }
                    //cout << "con" << con << endl;
                    if(con == 1)
                    {
                        break;
                    }
                }
            }
            break;
        }
        if(win == true)
        {
            printf("langren\n");
        }
        else
            printf("lieren\n");
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/jiangchao98/article/details/119322756