CSP-J 第二轮 模拟赛三补题报告

2023-10-28 21:59

本文主要是介绍CSP-J 第二轮 模拟赛三补题报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

日期:2023年10月3日 星期二

学号:s07246

姓名:江守栋

目录

·  比赛概况        

·  比赛过程

·  题目分析

T1 【数字对应 digit】

1、题目大意

2、比赛中的思考

3、解题思路

4、AC代码

T2【技能学习 skill 】

1、题目大意

2、比赛中的思考

3、解题思路

4、AC代码

T3【等于 equal】

1、题目大意

2、比赛中的思考

3、解题思路

4、AC代码

T4 【最小方差 variance】

1、题目大意

2、比赛中的思考

3、解题思路

4、AC代码

· 赛后总结


·  比赛概况        

        总分:210分

        T1 【数字对应 digit】100

        T2 【技能学习 skill】 100

        T3 【等于 equal】10

        T4 【最小方差 variance】0

·  比赛过程

 今天的比赛吸取了昨天的经验,按照顺序做的

T1 最开始想用桶去做,但是看了眼数据感觉会爆,所以改变思路,AC了

T2 看到题就感觉应该是贪心,认真读题后发现其实是一道数学题,肝了30分钟后也成功AC

T3 发现好像很难的样子,尝试DP后发现写不出来,就拿了数据范围里的特殊部分分

T4 我这个小蒟蒻根本读不懂题,直接输出的样例

·  题目分析

T1 【数字对应 digit】

1、题目大意

        给定一个长度为 n 的序列 A,让序列 A 的每个数字对应一个正整数,组成序列 B

         序列B 里的数字不能在序列 A 里出现过,序列 A 中的第 i 个整数与序列 B 中的第 i 个数对

        应,对应关系可随意指定,但是必须一一对应

        输出字典序最小的序列B

2、比赛中的思考

        刚开始看到 可随意指定 时以为比较难做,后来发现其实很简单,一开始想用桶去做题,但

        数据量太大,桶会炸,我陷入了沉思...

        就在这时,我想到了Y1学到的STL库中的 map ,将桶换成map,直接AC

3、解题思路

        定义两个 map 一个用来存原数组中的元素出现的次数,一个用来存第 i 个位置对应的元素。

        边输入边桶标记,然后循环处理,如果该位置被更新过则直接输出,否则从前往后找第一个

        没有出现的元素,并将其标记为已出现,输出即可。

4、AC代码

        

#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
map<int,int> b,t;
int main()
{freopen("digit.in","r",stdin);freopen("digit.out","w",stdout);cin>>n;for(int i=1;i<=n;i++){cin>>a[i];t[a[i]]++;}int x=1;for(int i=1;i<=n;i++){if(b[a[i]]){cout<<b[a[i]]<<' ';}else{while(t[x]!=0) x++;t[x]=1;b[a[i]]=x;cout<<b[a[i]]<<' ';}}fclose(stdin);fclose(stdout);return 0;
}

        

T2【技能学习 skill 】

1、题目大意

        n个同学学习新技能。
        有m份资料,可以随意分给每位同学。
        同学的资料不足k分将无法学习。
        同学拿到p份资料,每分钟增长p个技能点,
        但上限为q。
        共有t分钟,求同学们的技能点数之和最大值。

2、比赛中的思考

        看到数据范围后就觉得此题非常之不对劲,研究样例后发现其实就是一道数学题,也是直接

        AC

        鬼知道我调了多久

3、解题思路

        因为数据很大,所以我没有想别的,当成一道数学题来做的,直接一手阳寿算法,O(1)

        间复杂度,告别超时,分类讨论所有情况

        1.每人分 k 份足够分,有剩余

           此时每人分 k 份之后将剩余的平均分给每个人

        2.每人分 k 份不够分

           舍弃不够分的人,每人分 k 份,将不够 k 份的平均分给那些已经有 k 份资料的人

        3.每人分 k 份足够分,无剩余

           正好每个人分 k 份,实现共同富裕

4、AC代码

        

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,q,t,x,y;
int main()
{freopen("skill.in","r",stdin);freopen("skill.out","w",stdout);cin>>n>>m>>k>>q>>t;if(n*k>m){n=m/k;m%=k;x=k+m/n;y=m%n;}if(n*k==m){x=k;	}if(n*k<m){m=m-n*k;x=k+(m/n);y=m%n;}if(x*t>=q){cout<<n*q;}else if(x*t<q && (x+1)*t>=q){cout<<y*q+(n-y)*x*t;}else{cout<<n*x*t+y*t;}fclose(stdin);fclose(stdout);return 0;
}

T3【等于 equal】

1、题目大意

        给定一个长度为n的序列,序列里每个元素属于-2,-1,1,2中的一个。
        请问多少个子数组满足最大值的绝对值等于最小值的绝对值。

2、比赛中的思考

        完全没有思路,一开始想用二维dp拿部分分的,但是有点难写,后来尝试另一个特殊情况

另有 10% 数据:所有数字的绝对值相等 

         直接判断的上面这个情况,拿了十分,但是赛后发现其实还可以再拿下面这个情况的十分

另有 10% 数据:所有数字均为正整数

        如果加上判断,这十分应该也可以拿到 (白丢10分 QwQ)

3、解题思路

        赛后听了老师的讲解,逐渐有了写头绪,大体可以分为三种情况:

        1.   子数组的数字完全相同

        2.   最小值-1,最大值1

        3.   最小值-2,最大值2

        统计这三种情况分别有多少子序列,输出即可

        

4、AC代码

#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=5e5+10;
const int inf=0x3f3f3f3f;
int n;
ll ans,num[maxn];
int nxt[maxn][5];
ll startpos,endpos;
int main(){cin>>n;memset(nxt,0x3f,sizeof nxt);for(int i=1;i<=n;i++){cin>>num[i];}ll cnt=1,lst=num[1];for(int i=2;i<=n;i++){if(num[i]==lst){++cnt;}else{ans+=cnt*(cnt+1)/2;cnt=1;lst=num[i];}}ans+=cnt*(cnt+1)/2;for(int i=n;i>=1;i--){for(int j=0;j<=4;j++){nxt[i][j]=nxt[i+1][j];}nxt[i][num[i]+2]=i;int maxpos1=nxt[i][1+2];int maxpos2=nxt[i][2+2];int minpos1=nxt[i][-1+2];int minpos2=nxt[i][-2+2];startpos=max(maxpos2,minpos2);endpos=n+1;if(startpos!=inf&&startpos<endpos){ans+=endpos-startpos;}startpos=max(maxpos1,minpos1);endpos=min(min(maxpos2,minpos2),n+1);if(startpos!=inf&&startpos<endpos){ans+=endpos-startpos;}}cout<<ans;return 0;
}

T4 【最小方差 variance】

1、题目大意

        给定一个无根树T。
        T含有N个点,N-1条边,边权全部为1。
        在T中找一个树根root。
        树根确定后计算出每个点到root的距离,得到一个长度为n的序列a。
        请让序列a的方差最小。
        输出的方差乘以n方。

2、比赛中的思考

        不会,直接输出样例    (题都读不懂的啊喂)

3、解题思路

        使用 vector 存储每个点的邻接点,然后从1作为根开始 DFS。

        当某一个结点作为根时,方差的答案有两个贡献,一个是该结点作为根所在的子树的贡献

         一个是当前点上方的祖先结点的贡献,所以需要 DFS 两次

4、AC代码

#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const int maxn = 1e5 + 10;
ll sum2[maxn], sum1[maxn], sz[maxn], n, res;
vector<int> G[maxn];
void dfs1(int u, int f) {for (int i=0;i<G[u].size();i++) {int v=G[u][i];if (v == f) continue;dfs1(v, u);sz[u] += sz[v];sum1[u] += sum1[v];sum2[u] += sum2[v];}sum2[u] += sz[u] + 2 * sum1[u];sum1[u] += sz[u];sz[u] += 1;return;
}
void dfs2(int u, int f, ll s1, ll s2) {res = min(res, n * (s2 + sum2[u]) - (sum1[u] + s1) * (sum1[u] + s1));for ( int i=0;i<G[u].size();i++) {int v=G[u][i];if (v == f) continue;ll ret1 = sum1[u] - (sum1[v] + sz[v]) + s1;ll ret2 = sum2[u] - (sum2[v] + 2 * sum1[v] + sz[v]) + s2;ll szu = n - sz[v];dfs2(v, u, ret1 + szu, ret2 + 2 * ret1 + szu);}return;
}
int main() {int t;cin >> t;while (t--) {cin >> n;for (int i = 1; i <= n; i++) {G[i].clear();sum1[i] = sum2[i] = sz[i] = 0;}for (int i = 1; i <= n - 1; ++i) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}res = LONG_LONG_MAX;dfs1(1, 0);dfs2(1, 0, 0, 0); cout << res << endl;}
}

· 赛后总结

        今天的题目相比昨天,难度其实差不多

        第一题,用桶标记会炸,但我想到了 map ,所以有时候做题不要在一种方法上死磕,要及时

        尝试转变思路,说不定就找到了正确的解法。

        第二题,是一道纯数学题,我一开始对着样例想了好久,但思路依旧很乱,但后来我拿出了

        草稿纸和笔,在纸上演算了几遍,不一会就找到了正确的思路

        当你没有思路的时候,就不要再凭空想象了,这个时候,纸笔就是你最好的战友。

        第三题,这种难题我并不是奔着100分去的,而是瞄准了部分分,但是赛时我只专门想了一种

        情况,只得了10分,但其实还有一类特殊数据我可以拿到分,我完全可以在输入时判断一下

        ,分为两种不同的情况,再去采用不同的骗分、暴力策略。所以即使是暴力求解,也要看清

        楚数据范围,说不定就漏掉了哪一类明明可以拿到分的数据呢,这种时候,因为粗心丢掉的

        10分20分很可能就决定了你是一等奖还是二等奖

        第四题我压根看不懂题,只能输出样例,可奈何这是多组样例,一分也没骗到(悲)

        今天的比赛让我收获了很多,我一定会继续巩固提升自己,在考试时把自己的思路打开,

        利用好草稿纸这件法宝。明天的比赛,我定会再接再厉,考出自己理想的分数!

        

这篇关于CSP-J 第二轮 模拟赛三补题报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296243

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+