window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/xkzro04i.png" ], }

CSP-J 2023 赛前模拟赛 Day 5 比赛复盘

CSP-J 2023 赛前模拟赛 Day 5 比赛复盘

分数:$100+0+0+20=120$

前言:

这次模拟赛考的不理想,虽然只考了 $1$ 个小时就去香港办证了,但是第二题也是有可能拿到全分。预计的分数是 $100+(40\sim70)+(10\sim40)+20=(170\sim230)$,但是第二题和第三题爆零了。

分析:

T1:

第一题是一道十分简单的模拟题 有脚就能做,很快就 AC 了。

AC Code

#include <cstdio>
#include <list>
#include <algorithm>
using namespace std;

int a[103], n, k;

inline bool check()
{
    for(int i = 1; i <= n; ++i)
        if(a[i] < k)
            return true;
    return false;
}

int main()
{
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    sort(a + 1, a + n + 1);
    int ans = 0;
    while(check())
    {
        list<int> l;
        bool flag = false;
        for(int i = 1; i <= n; ++i)
            if(a[i] != a[i - 1] && a[i] < k)
            {
                l.push_back(i);
                flag = true;
            }
        if(flag)
        {
            ++ans;
            for(const auto &p: l)
                ++a[p];
            sort(a + 1, a + n + 1);
        }
    }
    printf("%d", ans);
    return 0;
}

T2:

第二题是一道数学题,具体思路是记录最小的大于 $0$ 的奇数和最大的大于 $0$ 的奇数,然后选择所有大于 $0$ 的数加起来,判断和是否是奇数,如果不是,则将其设为减去最小项与减去最大项的较大值,输出。这道题赛时写了一段 $O(n^2)$ 的递推,还写错了。

AC Code

#include <cstdio>
#include <climits>
#include <algorithm>
using namespace std;

int a[100003];

int main()
{
    int T;
    scanf("%d", &T);
    for(int n, L, R, ans; T--; )
    {
        scanf("%d", &n);
        L = INT_MAX;
        R = INT_MIN;
        ans = 0;
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d", &a[i]);
            if(a[i] > 0)
            {
                if(abs(a[i] % 2))
                    L = min(L, a[i]);
                ans += a[i];
            }
            if(a[i] < 0 && abs(a[i]) % 2)
                R = max(R, a[i]);
        }
        if(!(ans % 2))
            ans = max(ans - L, ans + R);
        printf("%d\n", ans);
    }
    return 0;
}

T3:

第三题暂时还没有想出来。赛时写了一段回溯代码想暴力拿部分分,但是爆零了,初步排查是 DFS 写错了。

AC Code

(暂无)

赛时 Code

#include <cstdio>
using namespace std;
using LL = long long;

const int MOD = 1e9 + 7;
int n;
LL a[200003], k, ans = 0;

inline LL pow(const int &base, int exp)
{
    LL ret = 1;
    while(exp--)
        ret *= base;
    return ret;
}

void dfs(const int &p)
{
    if(p >= n)
    {
        LL ck1 = a[1], ck2 = a[1];
        for(int i = 2; i <= n; ++i)
        {
            ck1 &= a[i];
            ck2 ^= a[i];
        }
        if(ck1 >= ck2)
            ans = (ans + 1) % MOD;
        return;
    }
    for(LL i = 0; i < k; ++i)
    {
        a[p + 1] = i;
        dfs(p + 1);
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%lld", &n, &k);
        k = pow(2, k);
        dfs(0);
        printf("%lld\n", ans % MOD);
        ans = 0;
    }
    return 0;
}

T4:

第四题也暂时没有思路。赛时是用四重循环枚举判断,时间复杂度 $O(n^4)$,可以拿 $20$ 分。

AC Code

(暂无)

赛时 Code

#include <cstdio>
#include <set>
using namespace std;

set<int> G[3003];

int main()
{
    int n, m, ans = 0;
    scanf("%d%d", &n, &m);
    while(m--)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        G[a].insert(b);
    }
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            for(int k = 1; k <= n; ++k)
                for(int l = 1; l <= n; ++l)
                    if(i != j && j != k && k != l && l != i && G[i].find(j) != G[i].cend() && G[i].find(k) != G[i].cend() && G[j].find(l) != G[j].cend() && G[k].find(l) != G[k].cend())
                        ++ans;
    printf("%d", ans / 2);
    return 0;
}

总结:

这场比赛总体不理想,第二题和第三题更是爆零了。下次努力!

签名:

$\text{TigerTan}$

日期:

$2023.10.06$

posted @ 2023-10-06 22:08  TigerTanWQY  阅读(89)  评论(0)    收藏  举报  来源