前言
之前考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;
}