可达鸭CSP-J复赛模拟day1赛后补题报告

日期:2023年10月2日星期一

S08695韩润琦

目录

1.比赛概况

2.比赛过程

3.题解报告

(1)数字降级

思路

STD

(2)分组

思路

STD

(3)抢夺地盘

思路

STD

(4)闯关

思路1

STD1

思路2

STD2

  1. 比赛概况

比赛共有四道题,满分400,赛时拿到50分。其中第一题50分,其余全部0分。

  1. 比赛过程

比赛开始时先把题目大体看了一遍,发现第一题是最简单的,于是就从T1开始做。

T1做题过程:这道题目其实完全是想复杂了, 我先是发现所有的偶数的情况答案一定都为1,因为它一定可以整除2,而2又是一个素数,所以我先写了一个判断偶数的if,然后直接输出1,再return 0就可以了(其实,根据唯一分解定理,所有的合数都满足此情况,直接判断哪些是素数就可以了)。接着我便开始处理奇数的情况,我先是写了一个for遍历每个素数,然后每个去除n,接着我就发现了一个问题,就是:有两种情况:(1)我用除出来的这个数再接着往下遍历计算,可是i的值正在随着for变化,

我无法判断是继续往下除或是始终用这个i来除,抑或是舍弃这个商,用原来的n来除下一个i。所以我拿了两个数组来存我的这些数据,最后来遍历取min。

总而言之,我写了一堆废代码,一道18行就能AC的题目我写了70行,还WA了。

T2做题过程:情况和T1很像,也是写了一大堆无用的代码。我是先把输入进去的数组sort了一下,然后就那首元素(也就是最小的那个)去往后找递增序列。

于是,我拿了一个find函数,去二分查找去找下一个元素。我还拿了一个flag的数组准备用它来记录是否还递增以及其不再递增和位置,然后拿到a数组里去取内容,

再用sum累加。我还写了“zhaoshu”和“minn”两个函数来查找下一次开始的位置。但测试的时候我无论输入什么数据都没有输出,于是此题没有成绩。

T3做题过程: 这一道题目大眼看过去很明显是一道DP的题目,而且是熟悉的线性DP的合唱队列问题,但因为忘了线性DP的模板所以此题也是0分。以后因该加强背诵。

T4做题过程:此题因为时间原因,没有完成所以也是0分。

  1. 题解报告
  1. 第一题:数字降级

情况:赛中50分,已补题。

题意:题目很简单,就是求一个数需要除几次,才能变成素数。

赛时本题想法:根据唯一分解定理,可以知道任意一个大于等于 的数字,都可以找到另一个数字将它除成质数。因此可以直接判断输入的数字是否为质数,如果为质数输出 0 ,否则输出 1 。

直接给出AC代码

代码:

#include <algorithm>

#include <cmath>

#include <cstdio>

#include <cstring>

#include <iostream>

using namespace std;

int main() {

    ll n;

    cin >> n;

    for (int i = 2; i <= n / i; i++) {

        if (n % i == 0) {

            cout << 1 << endl;

            return 0;

        }

    }

    cout << 0 << endl;

    return 0;

}

  1. 第二题:分组

情况:赛中0分,已补题。

题意: 寻找上升序列,然后找到不上升的位置,那最小的节点,最后把最大值相加。

赛时本题想法:已在比赛过程中详细说明,再次不做过多赘述。

题解:考虑有多少个小组分数可以至少为 1,这些小组中必须有一个0 。

所以假设 0有 x个,那么就说明有x 个小组分数至少为1 ,此时答案增加 x(这一步是考虑这些小组对答案的贡献)。

再考虑有多少个小组分数可以至少为2 ——这些小组必须有一个1 ,并且小组分数至少为2 的小组的数量一定小于等于小组分数至少为 1的小组数量,所以涉及到一个求 min 的操作。

直接给出AC代码

代码:

#include <algorithm>

#include <cmath>

#include <cstdio>

#include <cstring>

#include <iostream>

#include <map>

#include <queue>

#include <set>

#include <stack>

#include <string>

#include <vector>

using namespace std;

#define TIE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

typedef pair<int, int> pii;

typedef long long ll;

typedef unsigned long long ull;

const int N = 1e5 + 10, M = 1e5 + 10;

const double PI = acos(-1.0);

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值