前言

本篇文章着重介绍CSP认证第二题常见考点,以【202012-202206】6次真题的第二题为例,旨在帮助你我从70分(暴力模拟,运行超时)到100分(利用特定技巧,降低时间复杂度)。

此文参考了众多大佬的优秀文章和视频,感恩你们的分享。


考点

  • 202009:常规模拟,不卡时间
  • 202012:前缀和&后缀和
  • 202104:二维前缀和
  • 202109:一维差分
  • 202112:分段&差值
  • 202203:一维差分
  • 202206:稀疏数组

前置知识学习

前缀和与差分 图文并茂 超详细整理(全网最通俗易懂)林小鹿@的博客-CSDN博客_前缀和差分

【小白学算法】2. 稀疏数组 - 知乎 (zhihu.com)


真题

一、前缀和&后缀和

题干

202012-2 期末预测之最佳阈值

代码(100分)

#include<bits/stdc++.h>
using namespace std;const int MAX=1e5+5;
pair<int,int> pii[MAX];      //pair数组储存信息,每个pair存储一个同学的y和result
int pre0[MAX];               //记录该位置及前面的result为0的个数(前缀和)
int rear1[MAX];              //记录该位置及后面的result为1的个数(后缀和)
int k = -1,ma = 0;           //k用来记录最佳阈值,ma用来存储最佳阈值对应的预测成功的数目int main()
{int m;cin>>m;                     //输入mpii[0] = pair<int,int>(-1,-1);for(int i = 1;i <= m;++i)   //初始化pii数组cin>>pii[i].first>>pii[i].second;sort(pii + 1,pii + 1 + m);  //将所有学生信息按照阈值从小到大排序,方便后续前缀后缀和的操作for(int i = 1;i <= m;++i)            //记录前缀0个数if(pii[i].second == 0)pre0[i] = pre0[i - 1] + 1;elsepre0[i] = pre0[i - 1];for(int i = m;i >= 1;--i)           //记录后缀1个数if(pii[i].second == 1)rear1[i] = rear1[i + 1] + 1;elserear1[i] = rear1[i + 1];for(int i = 1;i <= m;++i){          //最终处理if(pii[i].first == pii[i - 1].first)continue;                   //如果有阈值相同的情况,直接跳过,避免重复if(ma <= pre0[i - 1] + rear1[i])//更新k和mama = pre0[i - 1] + rear1[i],k = pii[i].first;}cout<<k;return 0;
}

参考

期末预测之最佳阈值_Alan_Lowe的博客-CSDN博客_期末预测之最佳阈值

二、二维前缀和

题干

202104-2 领域均值

代码(100分)

//注意边界 前缀和
#include<bits/stdc++.h>
using namespace std;const int MAX=6e2+10;int main()
{int n,L,r,t,res=0;cin>>n>>L>>r>>t;int g[MAX][MAX];for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){cin>>g[i][j];g[i][j]+=g[i-1][j]+g[i][j-1]-g[i-1][j-1];    //前缀和预处理}for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){int left=max(0,j-r-1);int right=min(n,j+r);int down=min(n,i+r);int up=max(0,i-r-1);int sum=g[down][right]-g[up][right]-g[down][left]+g[up][left];    //前缀和int num=(right-left)*(down-up);        //求邻域内元素的个数if(sum<=t*num) res++;}cout<<res<<endl;return 0;
}

三、一维差分

题干

202109-2 非零段划分

代码(100分)

//注意边界,一维差分,C语言实现
#include<stdio.h>
#define MAX 500005
#define MX 10005int main()
{int g[MAX]={0},c[MX]={0};int n;scanf("%d",&n);int i,mx=0;for(i=1;i<=n;++i){scanf("%d",&g[i]);if(g[i]>mx) mx=g[i];}int t=1;for(i=1;i<=n;++i){if(g[i]==g[i-1]) continue;    //去重g[t]=g[i];++t;}n=t-1;g[0]=g[n+1]=0;                    //首尾各加0,便于比较for(i=1;i<=n;++i){if(g[i]>g[i-1]&&g[i]>g[i+1]){++c[g[i]];                //非零段增加}else if(g[i]<g[i-1]&&g[i]<g[i+1]){--c[g[i]];                //非零段减少}}int sum=0,ans=0;for(i=mx;i>=0;--i){sum+=c[i];if(ans<sum) ans=sum;}printf("%d",ans);return 0;
}

参考

CCF202109-2 非零段划分(100分)【序列处理】_海岛Blog的博客-CSDN博客

四、分段&差值

题干

202112-2 序列查询新解

代码(100分)

找到合理的循环变量和控制变量的增量和减量。

#include<bits/stdc++.h>
using namespace std;int main()
{int n,N;cin>>n>>N;long long A[100010];A[0]=0;for(int i=1;i<=n;++i){cin>>A[i];}A[n+1]=N;long long r=N/(n+1);long long dr=r;long long ddr;long long error=0;long long fx=0,gx=0;int flag=0;for(int i=0;i<=n;++i){fx=i;for(long long j=A[i];j<=A[i+1]-1;j=j+dr){gx=j/r;long long res=gx>fx?gx-fx:fx-gx;if(flag==1){    //第一个元素,单独讨论dr=ddr;flag=0;}else{dr=r;}if(j+dr-1<=A[i+1]-1){error+=dr*res;}if(j+dr-1>A[i+1]-1){    //最后一个元素,单独讨论error += (A[i+1]-j)*res;ddr =dr-(A[i+1]-j);flag=1;}}} cout<<error;return 0;
}

参考

202112(第24次)CSP真题202112-1,2讲解_哔哩哔哩_bilibili

五、一维差分

题干

202203-2 出行计划

代码(100分)

逆向思考,优先处理场所需求,判断出进入该场所需要的最早时间核酸报告和最晚时间核酸报告。

//注意边界
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;const int N=2e5+10;
int n,m,k,t,c,q;
int cnt[N];int main()
{scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){scanf("%d%d",&t,&c);int x=t+1-k-c,y=t-k;if(y<=0) continue;x=max(1,x);cnt[x]++;    //差分cnt[y+1]--;}for(int i=1;i<=200000;i++) cnt[i]+=cnt[i-1];while(m--){scanf("%d",&q);    //查询printf("%d\n",cnt[q]);}return 0;
}

参考

CCF-CSP 202203-2 出行计划 差分算法满分题解+解题思路_只须一笑不须愁X的博客-CSDN博客

六、稀疏数组

题干

202206-2 寻宝!大冒险!

代码(100分)

#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;int main()
{int n,L,S;cin>>n>>L>>S;struct tree{int x;int y;} a[1010];for(int i=1;i<=n;i++){cin>>a[i].x>>a[i].y;} int B[52][52];for(int i=S;i>=0;i--){for(int j=0;j<=S;j++)cin>>B[i][j];}int temp[52][52];int count=0;for(int i=1;i<=n;i++){if((a[i].x>(L-S)) || (a[i].y>(L-S))){continue;}for(int x=S;x>=0;x--){        //缩小查找的绿化图规模for(int y=0;y<=S;y++)temp[x][y]=0;}for(int k=1;k<=n;k++){        //同上int tempx=a[k].x-a[i].x;int tempy=a[k].y-a[i].y;if(tempx<0||tempx>S) continue;if(tempy<0||tempy>S) continue;temp[tempx][tempy]=1;}int flag=0;for(int x=S;x>=0;x--){for(int y=0;y<=S;y++)if(temp[x][y]!=B[x][y]) flag=1;}if(flag==0) count++;}cout<<count;return 0;
}

参考

暂时找不到当初参考的博文了。


结语

欢迎大家交流指正。祝福大家在CCF-CSP认证都能取得佳绩!

CCF-CSP 第二题70分->100分攻略【202012-202206】 C++/C相关推荐

  1. CCF CSP 公共钥匙盒 JAVA 201709-2 100分

    这道题做了几遍 感觉这次做得比较好的就是做好了每个函数的封装 无非使用了二维数组的排序  就变成了很简单的一道题 package csp2017_09_2;import java.util.Array ...

  2. CCF CSP 炉石传说 JAVA 201609-3 100分

    这个题麻烦在角色的信息不好处理 想想其实也好处理,只需要封装一个角色类,将生命值和攻击力封装起来就好了 还有一点是随从进场位置,如果出现在左边要使右面所有随从position+1 其实也好处理,正好! ...

  3. 大工计算机基础在线3,大工16秋《计算机应用基础》在线测试3-满分100分.pdf

    大工16秋<计算机应用基础>在线测试3-满分100分大工16秋<计算机应用基础>在线测试3-满分100分 大工 16 秋<计算机应用基础>在线测试 3 试卷总分:1 ...

  4. SQLserver----对成绩表、笔试成绩提高5分 100分封顶

    语法 update table   set 字段1=case          when 条件1 then 值1            when 条件2 then 值2           else  ...

  5. java 黑白皇后算法_不思议迷宫黑白皇后3分钟速刷攻略 平民速刷黑白皇后冈布奥/称号推荐...

    不思议迷宫国服v0.6.170113.05-0.0.22 手机版 类型:休闲益智大小:94KB语言:中文 评分:10.0 标签: 立即下载 不思议迷宫黑白皇后3分钟速刷攻略,平民速刷黑白皇后冈布奥/称 ...

  6. 腾讯云TCA运维认证题库内容、考试攻略及例题示范

    互联网行业作为这几年大热大火的行业,除了收入非常可观外还有非常广阔的前景,也有许多人对于这个行业有很多憧憬和向往.随着越来越多的人开始进入互联网行业工作.行业的需求面扩大,也就有越来越多的职业出现.腾 ...

  7. ccf 201412-4 最优灌溉 (100分)

    问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为&q ...

  8. 中职计算机高考提分技巧,2018年高考《各科目》提分技巧全攻略

    语文 1.语文文言文选择意思那个,叫选择错误的.只要是与现代意思相同的那个,百分之九十九是错的,不信自己查看最近高考的那题. 2.语文古诗词鉴赏分析手法实在找不到了丢借景抒情和对偶修辞.不能空题. 3 ...

  9. 雅思小白不报班,花3个月急速通关到6.5分,详细攻略!

    我的情况:去年七月份决定出国留学,次年一月份要递交申请,考虑到还有些杂七杂八的申请文书要写,给自己定了三个月冲关雅思的目标,目标分数是6.5分.一共考了两次,在十月底拿到了理想成绩.因为是自己学习,没 ...

最新文章

  1. 国产芯片WiFi物联网智能插座—电耗采集功能设计
  2. oracle9201怎么安装,Solaris10上安装64位Oracle9201
  3. C#中类的属性(Property)
  4. OpenCV学习笔记之扫描图像
  5. VS中添加第三方库及相对路径设置
  6. Contest2162 - 2019-3-28 高一noip基础知识点 测试5 题解版
  7. (10)vue.js 指令(2)
  8. 《深入浅出DPDK》读书笔记(三):NUMA - Non Uniform Memory Architecture 非统一内存架构
  9. shell脚本实现菜单操作
  10. Flutter基础—常用控件之文本
  11. thinkPHP使用中遇到的问题交流==
  12. Django框架零基础入门
  13. Redis介绍 AND SpringBoot集成Redis
  14. linux下回收站无法清空 解决
  15. Spring Cloud (Eureka,Feign,Hystrix整合)
  16. python打开桌面文件_python整理桌面文件
  17. 怎么用计算机计算复利,如何用普通计算器计算复利
  18. TransactionDefinition
  19. 利用vue实现树表格分页
  20. html特效代码 枫叶,jQuery飘落的枫叶

热门文章

  1. linux find 文件夹类型,Linux find 强大的文件查找工具
  2. 【独家揭秘】微信可以自动加好友自动打招呼啦!
  3. 安装启动 Supervisor
  4. 亚马逊中国站获取商品库存信息
  5. drop_duplicates的keep参数是什么
  6. 架构拆分:如何让笨重的系统架构变灵巧?
  7. Python 的列表运算和列表常用函数
  8. 系统性能提升的经验和方法
  9. 性能测试的四大影响因素
  10. 如何画线得到股票中的压力点和支撑点