十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

集训二(递归递推)知识点

集训二(递归递推)知识点 1.B2004这道题主要考输出格式常见考点保留指定小数位数cout fixed setprecision(3) x endl;数字按固定宽度输出不足补前导零或空格cout setfill(0) setw(4) num endl; // 输出 0012cout setfill( ) setw(4) num endl; // 输出 12右对齐cout left setw(4) num endl; // 输出 12 左对齐setw 仅对下一个输出项有效每次都需要设置。setfill 和 left/right 是持久的。以八进制、十六进制形式输出可能要求带前缀如 0x或不带。int a 255;cout hex a endl; // 输出 ffcout showbase hex a endl; // 输出 0xffcout uppercase a endl; // 输出 0XFFcout dec a endl; // 恢复十进制科学计数法与定点小数double x 123.456;cout scientific x endl; // 输出 1.234560e02cout fixed x endl; // 输出 123.4560003.B2147这题用到了第一题的setprecision同时还用到了数学函数这里补充一下关于setprecision的知识同时回顾一下常见的数学函数吧setprecision(n)当setprcision(n)不与fixed / scientific连用时表示n位有效数字整数位也在其中当setprecison(n)与fixed / scientific连用时表示精度为n位也就是保证n位小数常见的数学函数5.P1226 【模版】快速幂快速幂的作用是快速求出ab的值实现思路可以看这道题的题解讲的非常好这里我把代码放上来用于快速回顾#includeiostreamusingnamespacestd;intmain(){longlonga,b1,p;cinab1p;longlongans1,basea,bb1;//初始准备//ans是最终答案base是权值初始是底数的1次方while(b!0){//关键1b二进制右移直到为0if(b1){//关键2当b末位为1时ansans*base%p;//乘上权值记得取模//关键3(AB) mod b (A mod b B mod b) mod b//(A×B) mod b ((A mod b) × (B mod b)) mod b}basebase*base%p;//关键4因为右移权值进位b1;//记得右移且赋值}printf(%ld^%ld mod %ld%ld\n,a,b1,p,ans);return0;}6.B3860类似读完论文参考文献的题主要考察递归以及去重条件这题去重可以用set容器和bool数组标记法以后遇到类似的可以参考这俩个思路我看答案没递归用的双端队列deq和set也是不错的思路这题可以回顾一下输入输出解绑加速加速输入输出流//1ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);//2可以用0替换这两个关键字ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);使用前为了保证 C 的 cin/cout 与 C 的 printf/scanf 可以混用且输出顺序正确标准库会让两者保持同步这导致 cin/cout 在每次操作时都要额外检查并刷新缓冲区效率较低使用后cin/cout 独立使用自己的缓冲区不再与 C 流同步速度会显著提升可能快几倍甚至几十倍。但代价是不能混用 cin/cout 和 printf/scanf否则输出结果可能乱序或丢失7.P1162染色题考的是搜索我的做法是把正方形输入到(1,1)~(n,n)然后外面再加一圈0从(0,0)开始搜索把所有遇到的外围0改成2现在我看到了另一种做法思路是遍历矩阵的每个格子当遇到一个未被访问的 0 时启动一次 DFS。DFS 会将该格子及其所有相邻的 0上下左右标记为一个独立的连通区域并为该区域分配一个唯一的 id从 3 开始递增。同时DFS 还会判断该区域是否触及矩阵边界如果搜索过程中遇到边界越界则返回 false表示该区域连通到了外部不被完全包围。如果遇到 1 或已经标记过的同区域格子则返回 true表示该方向被障碍或已访问区域阻挡。通过逻辑与组合四个方向的返回值只要有一个方向触及边界最终结果即为 false。感觉还是我的方法简单8.P1010题意是把数字拆成如13152102825212(2(22(0))2)2(2(22(0)))2(2(2)2(0))22(0)的形式我用的是二进制右移找到所有的2n再递归分解n拼接字符串遇到了一个查了好久的bug运算符优先级低于复习一下运算符优先级吧顺便运算符优先级我看题解的思路是用pow和log2函数写的我这个其实更偏向于不会用数学函数写出来比较绕的答案贴上大佬代码膜拜一下#includeiostream//不解释#includecmath//其中有log2(x)和pow(x,y)函数具体作用往下看usingnamespacestd;voiddivide(intx){boolflagfalse;//...判断是否是第一个如果是的话就不输出加号while(x!0){inttint(log2(x));/* log2(x)这个函数求以2为底x的对数例如log2(8)返回3因为2^38 而这里把返回值强制转换为int是为了找到离x最近又小于x的能表示为2^k的数 例如int(log2(137))就能返回7而2^7128恰为离137最近的能表示为2^k的数 */if(flag)cout;//开头不输出加号if(t1)cout2;//如果这一项是1输出2不递归elseif(t0)cout2(0);//如果这一项是0输出2(0)不递归else{cout2(;divide(t);//递归一层把括号里的数分解输出cout);}x-pow(2,t);//继续处理下一项flagtrue;}}intmain(){intn;cinn;divide(n);return0;}log2函数计算以 2 为底的对数C11 起x 必须 0注意本题用了log2强制转成了intdoublelog2(doublex);floatlog2(floatx);longdoublelog2(longdoublex);doublelog2(IntegralType x);// 整型参数会转换为 double
返回列表