可参考资料
来骗:
- 骗分导论:这是一本教你怎样在比赛中骗分的书
- CCF CSP3,4,5题骗分大法(2020年6月3,4,5三个真题举例)
- CCF CSP真题202104-3.4.5骗分讲解
using namespace std;
别忘记加
刷题记录
2021年9月
这次考了190=100+70+0+20+0,下来做了做发现第二题差一点想法,拿70是真的亏
202109-1 数组推导
没什么好说的
202109-2 非零段划分
优化!还是TMD优化!
暴力只能70,想到了优化的方法才能100
还是和前缀和的思想很类似,后续计算可以用之前计算的中间结果推出来,从而降低复杂度
前缀和思想
vector本质上还是数组,是内存中的连续空间,删除元素的复杂度最坏还是O(n) 参考
一定注意题目的数据量要求,这道题没按常理出牌,数据大小是5e5,而不是1e5
去重+有序可以用
set
实现,set插入自动有序因为
set
底层实现是红黑树,其查找、删除和插入时间复杂度都比顺序表要好 O(logn)
贴一下100分的代码:
1 |
|
202109-4 收集卡牌
这题考试嗯写了个DFS,水了20分
20分代码:
1 |
|
2021年4月
202104-1 灰度直方图
202104-2 邻域均值
题目链接——二维前缀和
初次尝试:
无脑写了四层循环,这样写会超时,只能拿70,同时还出现如下的一些问题:
- 循环的边界条件出错
- 整型的
/
除法为整除,导致结果出现精度问题
正解:
二维前缀和,时间复杂度可以降到O(n^2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using namespace std;
const int N=1010;
int q[N][N]={0},s[N][N]={0};//开二维数组的时候不能太大
int main()
{
//输入部分
int r,n,l,t;
cin>>n>>l>>r>>t;
int num=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&q[i][j]);
//计算前缀和
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+q[i][j];
//计算结果
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
double sum=0,count=0;//这里要声明为浮点类型:方便后续除法保留小数部分保留精度
int x1=i-r,x2=i+r,y1=j-r,y2=j+r;//下标
if(x1<1)
x1=1;
if(y1<1)
y1=1;
if(x2>n)
x2=n;
if(y2>n)
y2=n;
//计算区间和
sum=s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];//数组的下标还是易错
count=(x2-x1+1)*(y2-y1+1);
if(sum/count<=t)
num++;
}
printf("%d",num);
return 0;
}要注意的点:
开二维数组的时候不能太大,开的大的话会爆栈,应该使用全局变量,这样是在堆中开辟空间
!!!下标 !!!
202104-3 DHCP服务器
本题样例数据在1w左右,所以时间复杂度控制在n^2就可以
CSP考试时会有O2优化
这道题主要是搞清楚程序在什么时候应该干什么,相互之间的顺序
确定依照哪部分说明文字来写本道题也很重要,找对了按照正确顺序把文字翻译成代码即可
代码段复用cv的时候要注意是否要改参数
很大几率会由于题意理解偏差,导致一些难以发现的小问题,一定要多读题,理解题目意思
结构体声明技巧:数组下标即可拿来当做ip地址
明确时间关系和发送接收者的关系
client
和server
都可以是发送者或者接受者,理解实际过程
1 |
|
本题初次耗时大约在1.5h~2h
202104-4 校门外的树
挺有价值的一道dp题
详见本题解
- 预处理降时间复杂度
- 需要一维dp才行
有进步,现在至少能写出来逻辑正确的代码,就是会超复杂度
2020年12月
202012-1 期末预测之安全指数
202012-2 期末预测之最佳阈值
自己写了一下发现,这个题也不好写
70分TLE版本
vector构造函数写法:
vector(v.begin(), v.end());
是将v[begin(), end()) 区间中 (前闭后开) 的元素拷贝给本身
所以在下面第21行中
vector<pair<int, int>>v(s,s+m);
不用s+m-1
二元组 有两种:
map
和pair
,对应头文件分别为map
和utility
map有集合的性质,元素互斥,即map的key不能相同
pair则只是普通的二元组
pair使用sort()排序时默认按照first的值排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//#include <map>//map的头文件
using namespace std;
int m,cnt=0,theta=0;
const int N=1e5+10;
pair<int, int> s[N];//!!!
bool cmp(pair<int,int> a, pair<int,int> b)
{
return a.first<b.first;//根据fisrt的值升序排序
}
int main()
{
cin>>m;
for(int i=0;i<m;i++)
scanf("%d %d",&s[i].first,&s[i].second);
vector<pair<int, int>>v(s,s+m);//前闭后开!!!
sort(v.begin(), v.end(), cmp);
for(int i=0;i<m;i++)
{
if(i!=0&&v[i].first==v[i-1].first)
continue;
int count=0;
for(int j=0;j<m;j++)
if(v[j].first<v[i].first&&v[j].second==0||v[j].first>=v[i].first&&v[j].second==1)
count++;
if(count>=cnt)
{
cnt=count;
theta=v[i].first;
}
}
cout<<theta;
return 0;
}满分版本
害TMD是前缀和的应用——前缀和的应用场景可以总结一下
注意:遇到s[i].first相同的学生时,应该按第一个考虑!!!
一维前缀和可以将时间复杂度从O(n^2)降到O(nlogn)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using namespace std;
int m,cnt=0,theta=0;
const int N=1e5+10;
pair<int, int> s[N];//!!!
int sum[2][N]={0};//可以称得上点睛之笔
int main()
{
cin>>m;
for(int i=1;i<=m;i++)
scanf("%d %d",&s[i].first,&s[i].second);
sort(s+1, s+m+1);//sort()依照pair的first排序
for(int i=1;i<=m;i++)
{
sum[0][i]=sum[0][i-1]+(s[i].second==0);
sum[1][i]=sum[1][i-1]+(s[i].second==1);
}
for(int i=1;i<=m;i++)
if(s[i].first!=s[i-1].first && cnt<=sum[0][i-1]+sum[1][m]-sum[1][i-1])
{
cnt=sum[0][i-1]+sum[1][m]-sum[1][i-1];
theta=s[i].first;
}
cout<<theta;
return 0;
}
2020年9月
202009-1 称检测点查询
本题没什么代码细节,要注意的:
- 稳定排序函数stable_sort(),见链接
- STL中map和set的区别
- pair还是比较好用的,用法不能忘
202009-2 风险人群筛查
这题的AcWing有大问题,不看也罢,官网能过的正确答案AcWing过不了,有缺陷的官网过不了但AcWing能过就离谱
事实证明这种不起眼的小题目还是容易翻车
**翻车翻在**:
一个人可能有多段滞留时长超过k的时段
然而最初我没考虑这点,直接每当这个人停留时长>k时就
cnt++;
,后来才意识到上面的问题,修改后果然没问题了- 考虑情况不全面了属于是
100分AC代码:
1 |
|
2020年6月
202006-1 线性分类器
自己写的也能拿100,见提交记录的WA提交,但是很繁琐,逻辑也不那么简单
可以看看这篇题解,代码量少很多,同时用到了set集合的特性
202006-2 稀疏向量
- 双指针算法
- 用vector代替数组就不需要提前开很大的数组,而且可以用vector的许多方便的函数
可以参考这篇题解改一改代码规范
2019年12月
201912-1 报数
把边界情况考虑完善就OK
201912-2 回收站选址
暴力枚举 复杂度O(n^2)就够
- 本文链接:https://wan-nan.github.io/2021/07/22/CCF-CSP%E7%9B%B8%E5%85%B3/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。