前言
学那么多东西,那这些有啥用呢? 很遗憾,没啥用
实际上,有很多问题是可以通过我们这些天学习的内容来实现的。
首先,在这里推荐一些做题的平台:
这些平台的好处在于,写完题目后,我们可以将代码提交到网站上测评,
帮助测试出算法中的问题并加以巩固。
同时,做不出题目时,可以看一看题解,学习会更方便。
1. A + B Problem
题目传送门: P1001 A+B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目比较简单,输入A和B,要求输出A+B。
但是,作为一个合格的OIer,审清题目很重要。
做题时,读完题面,先看数据范围,避免数据溢出。这题的数据是
-10^9 <= a, b <= 10^9 (一般来说,a ^ b表示a的b次方)
那没事了,因为int类型的储存上限大约是±( 2 * 10 ^ 9 ),没有溢出。
那我们就可以大胆写题了:
#include<iostream>
using namespace std;
int a, b;
int main()
{
cin >> a >> b;
cout << a + b << endl;
return 0;
}
需要注意,在定义变量时,一般定为全局变量,即在main()外边。
这样做有两点好处:一是变量会自动初始化为0,二是需要比较大的数组时,main函数里边的空间可能会不够,导致程序错误。
顺带提一句,输出时作者习惯加换行,调试时更加清晰,同时洛谷的评测机会忽略末尾的换行,也就是这样做对评测结果没有影响。
写好代码后,记得先在本地的dev-c++上运行一遍,确认答案正确,接下来就是提交了。
那么我们在洛谷上做的第一道题目就完成啦~现在回到题目,点击提交答案,把代码粘贴进去吧~(什么?你说没账号?注册一个呗!以后我们的做题都会在洛谷上进行,没账号怎么学)
2.查找特定的值
题目传送门:B2093 查找特定的值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
看到这个题目,是不是就想到了数组?没错,这道题的思路很清晰:
老样子,先看数据范围:n <= 10000。莫慌,正常情况下,题目的限时是1s(即程序必须在1s内输出结果,否则算作超时),而计算机1秒能进行大约1亿次运算,完全不慌。
首先创建一个数组(假设名为a),把读入的n个数塞进这个数组里,然后读入x,
从左到右找一遍,找到了直接输出下标,否则输出-1。
怎么样,是不是很简单?读者朋友可以先试着自己写代码、调试或者提交上去试试,再来看正解哦
正解:
#include<iostream>
using namespace std;
const int MaxN = 10005;
//定义最大值,const表明这个量不能改变
//最好带数组的题都写一下,多开几个空间,
//又防止敲错(以后的题目会出现多个数组)
int a[MaxN], n, x;
//定义变量和数组
int main()
{
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
cin >> x;
//读入
for(int i = 0; i < n; i++){
//从0开始一直找
if(a[i] == x){ //找到了
cout << i << endl;//输出
return 0; //直接退出程序,不再运行
}
}
cout << -1 << endl;
//始终没有跳出,说明没找到,输出-1
return 0;
}
好啦,现在可以将上面的代码和自己的代码对照
一下,有不足也没关系,毕竟是第一次自己写代码,只要认真学习、做题,迟早会超越以前的自己!
3.开关灯
题目传送门:B2092 开关灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
第三道题目相对比较复杂,我们先理一理思路。
看到数据范围,n <= 5000,我们可以开数组a存储开关状态
(即a[i]为0表示第i盏灯关着,为1表示开着)
最开始,我们把数组a全部设成0,从第二个人开始考虑,简化问题。
可以发现,第i个人会从i号灯开始,改变编号为i的倍数的灯的状态。
于是,我们可以从第2个人开始模拟这些人的行为,记录每个人操作后灯的状态。
老样子,各位先自己写代码试一试,再来看下面的解:
#include<iostream>
using namespace std;
const int MaxN = 5005;
//定义大小
int n, a[MaxN];
//定义变量和数组
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) a[i] = 0;
//初始化状态(从1号开始)
//实际上因为a定义在main外面,所以初始值本来就是0
for(int i = 2; i <= n; i++){ //从第2个人开始模拟第i个人的行为
for(int j = i; j <= n; j += i){ //用j模拟第i个人当前操作路灯的编号
//这里的循环变量不要定义成i,即使重名不会报错但外面的i就不能用了,具体大家可以自行了解
if(a[j] == 0) a[j] = 1; //判断条件分支
else a[j] = 0;
//==不要写成=
//实际上可以写成a[j] = !a[j],但是不好理解,建议不要写
}
}
for(int i = 1; i <= n; i++){
//最后遍历一遍,找到关闭着的灯
if(a[i] == 0) cout << i << ' ';
}
return 0;
}
大家理解后最好自己再写一遍代码,调试后提交,上面的代码仅供参考。
实际上还有更优解,时间更短,这里由于作者懒篇幅原因不赘述,想要了解的可以查看题解。
结语
今天,我们介绍了洛谷这个网站,同时带大家尝试了三道基础题。
大家在课后可以到洛谷网站上,点击左侧的“题库”,选择难度为“入门”的题目,即红题做一做。
当然,有志向有兴趣的朋友也可以尝试看一看橙题,不懂并不丢人,最终通过自己的努力弄懂才是最宝贵的精神和品质。
今天就说那么多,最后,制作不易,如果你觉得这篇文章还不错的话,麻烦点个收藏点个关注,这是免费的,您随时可以取消。你们的支持是作者最大的动力!