26文科跨考北大软微-刷题日记1
作者:
船行渔歌
,
2024-11-05 22:55:24
,
所有人可见
,
阅读 3
/*虽然算法竞赛对考研无直接相关,但是我还是想试试。
今天是报名第二天,做一下昨天听完基础语法的第一讲的做题心得。
*/
/* 第一大点(库的选择)
#include <cstdio>包含scanf,printf
#include <iostream>包含cin,cout
#include <bits/stdc++.h> 万能库,包含以上2个,但编译时间过长(虽然不会计入代码运行时间)
库的选择问题:
**有对结果要求保留多少精度的选printf,即<cstdio>
*scanf不能直接输入字符串,要借助循环;
*scanf输入时不能限定小数点有几位
**若要输入输出字符串的话,更方便用cin,cout,即<iostream>【见AcWing 613. 面积】
*cout输出时如果要包含空格,这个空格要在""内。
第二大点(新函数与库)(基础不好的我原来只知道C语言中的<stdio.h>和<stdlib.h>)
**第一个新库#include <cmath>
*用到了其中的sqrt()【求平方根】和pow(a,b)【求a的b次方】
*用到了其中的max(a,b)【求a,b中较大的那个】
补充:max(a,b)=(a+b+abs(a−b))2
第三大点(贪心算法初相遇)【见AcWing 653. 钞票】
遇到循环输出有规律的东西时,我们可以先创立一个数组,把有规律(或是说有顺序的东西先按序排列进去,然后在用一个for循环遍历这个数组进行输出)
第四点(昨天收获最大的一题)【AcWing 656. 钞票和硬币】
**核心一:仍然是贪心的思想
*一般可以借助/和%的方法来进行贪心,但是/(我们想要整除),本题中的数字却是浮点数,则会导致我们进行标准的正常除法。
解决方法:使用 static_cast<int>(total / value[i]) 来计算纸币和硬币的数量。
static_cast<int> 会将浮点数转换为整数,但不会截断小数部分。
效果优于使用(int)total / (int)value[i];
原因是:当total、value[i]小于1时,(int)会让其==0,0/0无意义。
总结:static_cast<int>(total/value[i])是对2个浮点数正常相除的结果取整数部分
(int)total/(int)value[i] 是将2个浮点数都变成整数再整除(变了2次,精度更低且无法有效处理小于1的情况)
**核心二:浮点数的取余
解决方法:利用函数fmod(a,b),函数在<cmath>中;
**核心三:添加偏移量来避免精度问题
问的AI:通常,对于保留两位小数的情况,偏移量选择 0.0001。
浮点数在计算机中是以近似值存储的,这可能导致一些小数无法精确表示。例如,0.1 在二进制中是一个无限循环小数,因此在计算机中存储时会有微小的误差。这种误差在进行多次运算时会累积,导致最终结果不准确。
举例:
在处理硬币面值= 0.10 时,total 为 0.20,计算 0.20 / 0.10 应该得到 2,但实际结果可能是 1.9999999999999998,这会导致 static_cast<int>(1.9999999999999998) 得到 1,而不是 2。
*/