CCF-Csp算法能力认证,21.12.1序列查询(C++)含解析

前言

之前考csp只考了两百有些失败,所以打算好好刷刷题来提高一下,重学c++也是为了使用c++编程。

CSP认证也算一个很有含金量的证书,很多学校考研就包括了CSP认证达到一定分数免机试的条例,当然 200不行。最近看了很多讲csp的博客,主要推荐都是刷题为主,算法能力是经验累积。

也有推荐书目的,在这里也推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下

「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd=6vdq# 提取码:6vdq”复制这段内容后打开手机迅雷App,查看更方便」

考试时可以使用的编译器一般只有vscode和devc++。

还有就是考试最后几分钟已经不能提交代码了,前面有弄好的一定要早点提交。有分总比没分好。一般都可以在ccf,csp官网上去练习(有模拟考试)。

还有pta等网站,都有实时测评。

考试中也是提交完成后就会得到成绩或者编译错误超时等信息。

基本情况都和模拟考试的十分相似,有很多次提交机会,基本都是够用的。

还有就是该考试和之前学的数据结构有千丝万缕的联系。

最后就是就业的面试题中有很多类似的,我感觉刷算法题也是一种对数学能力的练习。

总之就是很有用的,但是很多网上的题目只有答案没有解析,像我这种菜鸟根本看不懂。

还有很多人使用stl,相对高级的算法,还有些实测不能跑出来,我的技术太差也不能修改。

总之网上的还是对小白不友好。

所以像我这样没啥实力的选手的解决方案或许能小白选手接受。

也希望有大神能够提供改良意见,敬礼!

---------------------------------------------------------------------------------------------------------------------------------

题目

【题目描述】

【输入格式】

【输出格式】

【样例 1 输入】

3 10
2 5 8

【样例 1 输出】

15
 

【样例 1 解释】

【样例 2 输入】

9 10
1 2 3 4 5 6 7 8 9

【样例 2 输出】

45

【样例 2 解释】

【子任务】

思路分析:

本题的思想比较简单,

按照题目的提示,可以想到数组中每个数,如案例1中的258,其中2一定会表示为00,因为第一个数前面第一个小于它的下标一定是0,而到=2时就停止,这时候不再小于2了,下标变成1,而这个1的数量就是到下一个相等的数量(5),到五会有三个数字,就是1*3=3。后面的规律都是一样的,以此类推。

题目中还有一个x,x就是0.1.2.3...x-1的边界。当x小于数组中的数的时候,大于x的部分都不计入最终的sum里面。

由于数组的首尾需要数字来真确计算相同下标的个数。所以在最后加入一个x,作为边界,如果前面有大于x的,由于是递增数组,所以有大于x的就应该直接跳出循环,后来加入的x不能保证大于前面的数。这个第一次测试没有想起来,虽然也是满分但是并不严谨。

下面是代码。

#include <bits/stdc++.h>//万能头文件 
using namespace std;


int main() {
	int n=0;//n是数组A的数字个数 
	int x=0;//x
	int resultsum=0;//存储结果 
	//const int N=10000;
	cin>>n>>x; 
	
	int b[n+1];
	b[0]=0; //用0开头 
	b[n+1]=x;//用x收尾 
	//输入 
	for(int i=1;i<=n;i++){
		cin>>b[i]; 
		
	} 
	
//	因为有i-1所以从1开始。
//初始的0可以确保数组的第一个数减去的是0,直接加入到数组中可以保证之后的计算没有问题。 
	for(int i=1;i<=n+1;i++){//多存一个数,第一个数下标为0,数值也为0 
		if(b[i]<=x){//是否小于x ,小于x才有f(i) 
//		 由于没有最后一个数就没有最后区间的值,如案例1里面的最后两个3,数组后加一个数x,就会包含在里面,=x又可以确保当数值大于x时不计算在里面 
			resultsum+=(b[i]-b[i-1])*(i-1);
			//结果等于前后两个数的差值*(I-1),前五个小于5,前六个小于6,减去前面已经减过的
			
		}
		else{
			break;
		} 
	}
	
	cout<<resultsum<<endl;


	return 0;
}

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值