蓝桥杯做题技巧

张开发
2026/4/10 19:40:35 15 分钟阅读

分享文章

蓝桥杯做题技巧
1.cin和coutcin/cout输入输出方便但是速度较慢所以需要用指令进行输入输出加速切记使用加速命令后不要同时使用cin/cout与scanf/printfcin/cout输入输出加速的指令ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);例子#includebits/stdc.h using namespace std; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int x,y; cinxy; coutyendlx; return 0; }2.计算时间和日期for(int year2014;year2020;year) for(int month1;month12;month) for(int day1;day31;day){ if(month1||month3||month5||month7||month8||month10||month12); else if(month2){ if((year%40year%100!0)||year%4000){ if(day29) break; } else{ if(day28) break; } } else{ if(day30) break; }3.当时间复杂度比较高时可以采用开方的方法需要求因子时要明白一个数开方后的值这里称这个数为a这个值为b那么把a整除的除数一定有一部分小于b有另一部分大于b可能还有一个数等于blong long a2021041820210418; vectorlong long f; for(int i1;isqrt(a);i){ if(a%i0){ f.push_back(i); if(a/i!i){ f.push_back(a/i); } } }这里假如a9那么i3f[0]1,f[1]9,f[2]34.计算有乘有除的复合运算时可以先除避免溢出我想要的(a*b)/c可以写成(a/c)*b5.求最小公倍数a × b gcd(a, b) × lcm(a, b)gcd(a, b)是最大公约数lcm(a, b)是最小公倍数#includebits/stdc.h using namespace std; long long lcm(int a, int b) { // 第一步计算最大公约数辗转相除法 int x a, y b; while (y ! 0) { int temp y; y x % y; // 余数 x temp; // 除数变被除数 } int gcd x; // 最终 x 就是最大公约数 // 第二步用公式计算最小公倍数 return (long long)a / gcd * b; // 先除后乘避免溢出 } int main(){ long long a,b; cinab; long long clcm(a,b); coutc; return 0; }6.sort函数数组怎么用#includebits/stdc.h using namespace std; int main(){ //(注意数组不能重复定义) //升序排序前三个 int a[5]{2,4,1,5,3}; sort(a,a3); for(int i0;i3;i){ couta[i] ; } coutendl; //升序排序所有 int b[5]{2,4,1,5,3}; int nsizeof(b)/sizeof(b[0]); //计算数组长度 sort(b,bn); for(int i0;in;i){ coutb[i] ; } coutendl; //降序排列所有 int c[5]{2,4,1,5,3}; sort(c,cn,greaterint()); for(int i0;in;i){ coutc[i] ; } return 0; }7.vector的初始化#includebits/stdc.h using namespace std; int main(){ int n5; //int a[n]{0}; //是正确的写法表示数组a所有的值都为0 //vectorint a[n]{0}; //是错误的写法 //vectorint a{0}; //表示只有a[0]0其他的a[1]、a[2]等未知 vectorint a(n); //或者vectorint a(n,0); //输出结果都是0 0 0 0 0 for(int i0;in;i){ couta[i] ; } return 0; }8.insert的用法注意vector使用insert插入数字时需要表明插入的位置。但是自动去重的set可以直接使用insert并且按顺序插入。#includebits/stdc.h using namespace std; int main(){ vectorint a{1,2,3,4,5}; a.insert(a.begin()1,20); for(int x:a){ coutx ; }//输出结果是1 20 2 3 4 5 return 0; }#includebits/stdc.h using namespace std; int main(){ setint a{1,2,3,4,5,2}; a.insert(6); for(int x:a){ coutx ; }//输出结果是1 2 3 4 5 6 return 0; }才发现我对vector理解的有点误差对于vectorint a的输入可以直接输入而不用必须要使用a.push_back(n);#includebits/stdc.h using namespace std; int main(){ int n5; vectorint a(n1);//已经确定了a有n1个数字且都初始化为0 for(int i0;in;i){//对前n个数赋值了但是第n1个数仍然为0 cina[i];//输入1 2 3 4 5 } a.push_back(9);//加入第n2个数并且赋值为9 for(int i0;in2;i){ couta[i] ; }//输出结果是1 2 3 4 5 0 9 return 0; }简单来说若刚开始已经确定了a的大小例如vectorint a(n)那么可以考虑使用直接输入若没有确定a的大小可以考虑使用a.push_back(需要写入的数字);。#includebits/stdc.h using namespace std; int main(){ vectorint a; //a[0]2;//会报错因为此时a是空的因此a[0]同样是空的 a.push_back(2);//正确的 couta[0]endl;//输出的结果是2 vectorint b(2); b[0]1; coutb[0] b[1]endl;//输出的结果是1 0 return 0; }9.四舍五入printf(%.nf,a);若n为0则表示对整数进行四舍五入。例如a1.5那么输出结果是2若a1.4那么输出结果是1若n1则表示对小数点后一位进行四舍五入。例如a1.45那么输出结果是1.5n2、n3、n4...情况与之类似#includebits/stdc.h using namespace std; int main(){ double a1.45656; printf(%.2lf,a);//因为a是double类型所以这里是lf(是L而不是1) return 0;//输出结果是1.46 }注意不要和输出的最小宽度弄混#includebits/stdc.h using namespace std; int main(){ double a1.45656; printf(%.2lf\n,a);//输出结果是:1.46 printf(%4f\n,a);//因为f默认输出6位小数所以这里设置的最小宽度4没起上作用 //输出结果是1.456560 printf(%9f\n,a);//要保证右对齐和最小宽度是9因此输出时会在左边补上一个空格 //输出结果是 1.456560 printf(%06.2lf,a);//输出结果是001.46 return 0; }10.取余%左右两边必须是整数类型例如10%(1e97)是错的因为1e9是double型有两种修改方法。第一种在代码前面写上const int mod1e97;接着10%(1e97);写成10%mod;第二种10%(1e97)写成10%(1000000007)11.怎么避免越界取模(a b) % p (a % p b % p) % p(a - b) % p (a % p - b % p) % p(a * b) % p (a % p * b % p) % pa ^ b % p ((a % p)^b) % p12.判断浮点数是否相等在需要判断浮点数是否相等时不能直接判断而是要取一个范围一般在0.1范围内。例如判断sum是否等于11625907.5798不能直接写if(sum11625907.5798)。而是要写成if(sum11625907.5sum11625907.6)。13.字符串string型不同的表达string a{n}n代表的直接是ascii码值#includebits/stdc.h using namespace std; int main(){ string s{65,97}; couts[1]; return 0; }//输出结果是astring snn代表的是字符型#includebits/stdc.h using namespace std; int main(){ string s65,97; couts[0]; //输出结果是6 (字符型) coutendl; couts[0]-0;//输出结果是6 (整型) coutendl; couts[1];//输出结果是5 (字符型) coutendl; couts[2]; //输出结果是, coutendl; couts[0]1;//输出结果是55 coutendl; couts[0]-01;//输出结果是7 (字符型 return 0; }

更多文章