CSP-J模拟赛1—总结

· · 个人记录

CSP-J模拟赛1—总结

2025.10.1

个人感受

这次做题情况还是很不理想的,只有 90 分,我在做的时候的问题就是不喜欢用纸和笔去思考,就在 dev 上面一顿写,结果想到的东西老是还没打出来就忘记了,还容易把自己绕晕。

T1 我的问题就是在思考的时候想到了超过 240 的情况,但是没有想超过 240 就一次性做完再走,我的代码里面写的是超过 240 就让他先去隔离 7 天再回来继续做,浪费了鸡尾酒很多时间。

T2 的问题就是没有想到预处理,同时我的变量该赋值为 -1 的我却赋值成了 0,导致爆 0

T3 考的是绝对值得运用,正如我开始所说,我没有在纸上面思考,没有画图,所以没有找出最优方法,而是直接暴力去枚举的。

T4 在考的时候没有什么思路,能感觉出来是要用 dp 来做,但是没有深入去思考,也就没有找到问题的方法。我这道题尝试过用贪心来做,但是错了,所以到后面就没再思考了,去继续想前面的题了。

T1 isolate 隔离

题意:

办公时间超过 240 分钟就会被隔离,AB 两地往返时间 400 分钟,求完成 n 件事所用的最短时间。

思路:

考试的时候思路有点混乱,所以重复做了一些无意义的事。

正解:

在便利 a 数组时判断 a[i] 是否大于或等于 240,如果是的话,肯定是一次性完成最优,先在 B 地把所有工作做完了再回去。

如果小于 240 的话,就每次判断加上新的数之后是否超过 240,超过就做处理:往返 AB 一次时间加 400

Code:

    while(n){
        int a;cin>>a;
        if(a>=240) b=1;
        s1+=a; //全加上 
        p+=a;
        if(p>=240){ //多了 
            s2=s2+p+400-a;
            p=a;
        }
        n--;
    }
    if(b==1){  
        cout<<s1;
        return 0;
    }

T2 sump 和积

题意:

求在 nm 之间数位和为 k 的数的数位积最大的数的最小值。

思路:

先预处理一下,把所有数字的和与积都用数组存起来,在循环里面直接用就好了。

和与积的规律:

Code:

    for(int i=1; i<=9; i++) {
        sum[i]=i;
        cmp[i]=i;
    }
    for(int i=10; i<=AW-10; i++) {
        sum[i]=sum[i/10]+i%10;
        cmp[i]=cmp[i/10]*(i%10);
    }

    for(int i=M; i<=N; i++) {
        if(sum[i]==k) {
            if(cmp[i]>ans2) {
                ans2=cmp[i];
                ans1=i;
            }
        }
    }

T3 lift 电梯停靠

题意:

m 个人要乘坐电梯,从 a 点到 b 点,求问一个点 x,使得所有点到 x 的距离之和最小(即为绝对值之和最小)。

思路:

先把 ab 输入进去,都存进数组 a,输入完之后给 a 数组排序,x 的最小值便是 a[m]

证明:

首先看到绝对值这个词就应该想到数轴,我们把这些 ab 点在数轴上表示出来,如图:

(此图例子:2-73-9

由初一学过的知识来看,当点的个数为偶数个时,x 取点 a[m \div 2] \sim a[m \div 2 + 1] 时总路程和最小。所以当且仅当 x \in [3,7] 时,取值最小,而他又要求 x 的最小值,那就是 3

而通过这张图片可以看出,x 的最小值为 a[m]

Code:

    for(int i=1;i<=m;i++){
        cin>>a[i]>>a[m+i];
        b[i]=a[i];
        c[i]=a[m+i];
        }
    sort(a+1,a+2*m+1);
    int s=a[m];

T4 select 分组选数

代码还没有调出来。