经历了这个第16届的蓝桥杯,确实知道自己有很多的东西不会,但是也是感受了一下这个比赛的难度和相关的算法水平,之前我一直觉得这个算法没啥写的,但是这个毕竟是自己专业的对应比赛,还是需要去认真的对待一下吧,等一下今年的这个成绩,查漏补缺一下;
1.入门题目
下面的这个就是基础版本的输入我们的矩形的长度和宽度,输出的就是这个周长和面积;但是对于这个输入的结果和输出的结果都是存在这个对应的要求的,输入的数据类型应该是double类型的小数;

我的提交答案的问题:下面的这个是我第一次和前面的几次提交的这个内容,分数是40分,但是一直没看出来这个问题哦,后来知道是忽略了这个对应的输出结果的精度的问题,但是这个精度好像是无法使用cout进行控制的,因此合格使用的就是原生的printf对于这个输出结果里面的精度进行控制,然后就通过了;

有了这个题目对应的经历之后,让我后面再次遇到了下面的这个类似的要求的题目之后,我处理起来就显得游刃有余了,不是那么的棘手了,也是用的这个printf解决了这个相关的问题;
2.关于数据类型
HZOJ里面的这个题目,本来是很简单的这个题目,但是如果使用int这个数据类型的话,最后的得分是40分,也就是部分的这个样例是无法通过的,但是换成long这个数据类型就没事了,这个我不理解,但是自己确实是进行了这个尝试的;

下面的这个题目也是需要去搞一下这个数据类型的问题的,不然也是只能通过部分的永利

3.计算复利
这个主要就是非常基础的去计算利润的这个题目,这种题目没啥好说的,但是我看了好久都没有发现自己的这个程序上面存在的这个问题;
关于这个输出要求里面的这个¥符号和这个对应的具体的利润,实际上我们可以直接在这个%d前面添加这个美元的符号就可以了,其次就是这个最后的计算结果的问题,本来应该是double类型的结果,但是我在最开始对于这个利润进行定义的时候,定义成为了int类型的,导致我的这个题目一直是没有通过的这个状态;

4.每一个数位上面的数字求和
这个其实是一个非常基础的问题,但是我本来想的是根据这个数据的范围对于这个进行分段处理,因为不同的数量级大小的数据,十位百位千位情况是有差别的;
但是因为这个事非常简单的题目,我就觉得如果需要我们进行分支循环的这个操作,这个题目就被我想的复杂了,因此这个时候我觉得这个题目不会这么复杂的,后来发现这个题目压根不需要对于这个数据进行分类,因此有的数位上面没有数据,我们的sum在进行运算的这个过程里面加上0就可以了;

5.注水问题的类型转换
下面的这个是问题:下面的这个题目的条件还是蛮多的,但是这个题目更像是一个数学问题,所以这个题目我自己是思考了一会,使用数学的方法直接求解了出来,因此这个思路上面没啥问题,就是细节上面出现了问题,下面我会详细的对于这个进行说明

下面的这个是我原来写的代码:这个代码我怎么看怎么对,但是这个一直得分是0分,我觉得非常的无语,我看题解的第一步才知道这个1/a,也就是两个证书的除法是得不到小数的,因此这个第一步就是错误的,但是如果我也想要得到这个浮点数,这个方法也是存在的,就是使用1.0作为被除数即可;

下面的这个是调整之后的代码:调整之后的这个代码直接一次性运行通过

6.今天前天和昨天
下面的这个题目实际上就是很多的分支循环条件罢了,这个要说是什么算法啥的,也算不上,但是这个题目非常的考察你对于这个问题的考察是不是非常的全面,漏掉任何的一个情况,都会导致这个题目的输出结果是错误的;
下面的这个就是这道题目的具体情况:

判断每一年的对应的月份的天数,平年和闰年的判断,这写都是我们最开始学习编程的时候经常遇到的这类问题,在这个题目里面进行了综合的考察;
我们如何判断这天是月的第一天,还是这个月份的最后一天,对于每一年的第一天和每一年的最后一天,我们也是需要进行额外的考虑的,这些情况我们的代码里面都是考虑到了的;
对于每一月里面的正常情况,我们直接月份不变,对应的day进行加减法即可,这个就是全部的可能的情况;
C++
#include<iostream>
using namespace std;
int day_month(int y,int m) {
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31;
case 4:
case 6:
case 9:
case 11: return 30;
}
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
return 29;
}
else {
return 28;
}
}
int main() {
int y,m,d;
cin >> y >> m >> d;
if (m == 1 && d == 1) {
cout << y - 1 << " " << "12 31" << endl;
cout << y << " " << "1 2" << endl;
}
else if (m == 12 && d == 31) {
cout << y << " " << "12 30" << endl;
cout << y + 1 << " " << "1 1" << endl;
}
else if (d == day_month(y,m)) {
cout << y << " " << m << " " << d - 1 << endl;
cout << y << " " << m + 1 << " " << 1 << endl;
}
else if (d == 1) {
cout << y << " " << m - 1 << " " << day_month(y, m - 1) << endl;
cout << y << " " << m << " " << d + 1 << endl;
}
else {
cout << y << " " << m << " " << d - 1 << endl;
cout << y << " " << m << " " << d + 1 << endl;
}
return 0;
}
int main1() {
int y;
cin >> y;
y += 2400;
int t = (y - 1900) % 12;
switch (t) {
case 0: cout << "rat" << endl; break;
case 1: cout << "ox" << endl; break;
case 2: cout << "tiger" << endl; break;
case 3: cout << "rabbit" << endl; break;
case 4: cout << "dragon" << endl; break;
case 5: cout << "snake" << endl; break;
case 6: cout << "horse" << endl; break;
case 7: cout << "sheep" << endl; break;
case 8: cout << "monkey" << endl; break;
case 9: cout << "rooster" << endl; break;
case 10: cout << "dog" << endl; break;
case 11: cout << "pig" << endl; break;
}
return 0;
}
7.关于时间的转换计算
下面的这个关于对于时间的转换和计算,我觉得也是非常有意思的:
我们需要从一个使用秒作为单位的数据里面提取出来这个对应的小时数,分钟数和秒数,并且判断这个给定的时间属于上午中午,还是下午,并且对于下午不是从13开始算的,而是从1开始算的,因此我们需要使用这个输入的数据减去这个43200,这个时候得到的新的数据再去进行这个运算,得到的才是以1开始的下午时间(相当于就是减去12小时)
下面的这个是关于题目的具体的描述:

下面的这个就是对应的代码,分为了几个不同的时段对于这个给定的时间进行判断:
C++
#include<iostream>
using namespace std;
int main() {
int t;
cin >> t;
if (t < 43200) {
printf("%02d:%02d:%02d am\n", t / 3600, t % 3600 / 60, t % 60);
}
else if (t < 43200 + 3600) {
printf("%02d:%02d:%02d midnoon\n", t / 3600, t % 3600 / 60, t % 60);
}
else {
t -= 43200;
printf("%02d:%02d:%02d pm\n", t / 3600, t % 3600 / 60, t % 60);
}
return 0;
}
8.考试结束的时间
这个题目也是一个非常恶心人的题目,他主要是这个12小时制和24小时制之间的这个转换是比较烦人的;

对于这个题目的代码编写而言,需要我们读者去考虑的影响因素还是非常多的,趁着现在刚刚结束这个题目,我记录一下这个整体的流程;
大于86400说明是超出了第一天的这个范围,我们需要减去这个86400,再去进行取余的操作;
小于43200表示的就是在上午,这个时候小于3600,0对应的12小时制里面的12,所以这个地方我们需要加上12个小时的秒数,也就是43200呢,接下来就是针对于这个t,取出来它对应的小时,分钟和对应的秒数,注解显示am即可;
接下来的这个,我们直接cv一下,为什么需要减去这个43200,主要是因为我们的大于12小时的部分都是从1重新开始了,所以这个需要减去43200秒,小于43200,证明这个12时还是12时,这个非常的绕,我也是真的无语了,大致就是这么个思路;
还有就是最后的百分数是如何进行表示的,如果第一次遇到,也不是那么容易解决的;
C++
#include<iostream>
using namespace std;
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
int t = a * 3600 + b * 60 + c + d;
if (t >= 86400) {
t -= 86400;
}
//下面的这个判断表示的就是上午的
if (t < 43200) {
if (t < 3600) {
t += 43200;
}
cout << t / 3600 << ":" << t % 3600 / 60 << ":" << t % 60 << "am" << endl;
}
else {
t -= 43200;
if (t < 3600) {
t += 43200;
}
cout << t / 3600 << ":" << t % 3600 / 60 << ":" << t % 60 << "pm" << endl;
}
printf("%.2f%%\n", d / 86400.0*100);
return 0;
}
9.关于这个高利贷的偿还金额
真的是非常的无语饿,一道数据的类型的转换的题目,居然就这样把我难倒了,真的是太不可思议了,我写到这个地方的时候居然不知道下一步应该如何取出来这个计算的结果的整数部分;
下面的这个就是具体的题目:

下面的这个就是我自己写的这个经典的错误代码,小白级别的代码

下面的这个就是正确的利用我们的数据类型转换求解结果的这个代码,是没有问题的:
