赞
踩
本次更新内容:2.14图论例题补充
目录
1.1 取消同步(节约时间,甚至能多骗点分,最好每个程序都写上)
2.3 最大公约数(greatest common divisor,gcd)和最小公倍数(least common multiple,lcm)
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
#include <bits/stdc++.h>
(1)工具->编译选项->编译器->编译时加入以下命令->调成C99
(2)工具->编译选项->代码生成/优化->代码生成->语言标准
按照字节对内存块进行初始化,注意只能填充0或-1
- #include <bits/stdc++.h>
- using namespace std;
- int a[10];
- int main()
- {
- memset(a,-1,sizeof(a));
- for(int i=0;i<10;i++)
- {
- cout<<a[i]<<endl;
- }
- return 0;
- }
可以填充任意数字
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- int main() {
- int arr[10];
- fill(arr, arr + 10, 2);
- return 0;
- }
蓝桥杯每一道题编译时间都限制在1s以内,遇到数据比较大的题目,往往需要降低时间复杂度。
由于蓝桥杯评测系统是根据通过样例数来评分,所以我们做题时一定要注意约定样例取值范围。
例题:K倍区间(暴力法只能通过部分样例,所以要用更好的算法)
- int i=1;
- int j=2;
- int m=i+j;
- int i=1;
- while(i<n)
- {
- i=i*2;
- }
- for(int i=0;i<n;i++)
- {
- cout<<i<<endl;
- )
- for(int m=1;m<n;m++)
- {
- int i=1;
- while(i<n)
- {
- i=i*2;
- }
- }
k为循环层数
做题时已经发现的不可能取到的数值,就不要再让计算机算了,尽量节省时间,蓝桥杯中目前遇到的还没有用到过过于繁琐的剪枝,大多也是在BFS和DFS中出现(bool vis)
例题:货物摆放
函数作用:查找该元素在数组中第一次出现的位置的地址(类似于0x的地址)
模型:find(查找起点,查找终点,查找目标元素)
同样,查找区间为[查找起点,查找终点)
- #include <bits/stdc++.h>
- using namespace std;
-
- int main()
- {
- int a[10]={2,6,8,1,3,7,5,1,0,11};
- cout<<find(a+0,a+5,8)<<endl;//打印类似0x地址
- cout<<find(a+0,a+5,8)-a<<endl;//打印数组【】内的序号
- return 0;
- }
PI=atan(1.0)*4
PI=3.14159265
类型 | 32位计算机 | 64位计算机 |
char | 1 | 1 |
short int | 2 | 2 |
int | 4 | 4 |
long int | 4 | 8 |
long long int | 8 | 8 |
char* | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
类型 | 范围 | 估计值 |
char | -128~+127 | |
short | -32767~+32768 | 3*10^4 |
unsigned short | 0~+65536 | 6*10^4 |
int=long | -2147483648~+2147483647 | 2*10^9 |
unsigned int | 0~+4294967295 | 4*10^9 |
long long | -9223372036854775808~+9223372036854775807 | 9*10^18 |
这个比赛很少用指针,如果想要存储字符串,用指针也是一个不错的选择(直接可以用string类避免用指针)
- //指针数组存储字符串列表
- #include <stdio.h>
- const int max = 5;
- int main()
- {
- const char *names[] =
- { //定义指针数组,存储字符串列表
- "Zhang San", //每个元素都是双引号括起来的
- "Li Si",
- "Wang Wu",
- "Su Wukong",
- "Tang Er",
- };
-
- int i=0;
- for(i=0;i<max;i++)
- {
- printf("Value of names[%d] = %s\n",i,names[i]); // 注意 %s
- }
- return 0;
- }
格中输入:
回车:
日期计算
在一个格中输入日期:
在另一个格中输入:
(第一个参数表示日期所在位置,第二个参数表示输出样式(会有提示))
回车:
题目描述
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
这题明显用代码写就过于复杂,还容易出错
首先用excel填充2000年1月1日到2020年10月1日(发现共有7580行)
然后设置单元格格式排成
这样的格式
这个时候我发现的问题是
感觉好像只是把外衣改了一下,但本质还是2000/1/1这个格式,导致替换出现问题(查找似乎还没有问题,这块不太懂,懂的佬麻烦给我指点一下)
这样的话我索性把AB列复制到word里(仅保留文字)
根据word复制过去的文字的格式查找
总共有1083个星期一
总共有250个1日
总共有34个星期一&&1日
所以有250+1083-34=1299天需要跑两公里
总共有7580天
所以有7580-1299=6281天需要跑一公里
所以共跑1299*2+6281*1=8879公里
- #include <bits/stdc++.h>
- using namespace std;
- int main()
- {
- int a=10;
- cout<<oct<<10<<endl<<hex<<10<<endl<<dec<<10<<endl;
- printf("%#o %#x %#d",a,a,a);//012 0xa 10
- return 0;
- }
- #include <bits/stdc++.h>
- using namespace std;
-
- int main()
- {
- int x,n,a[100];
- cin>>n;
- for(int i=0;i<n;i++)
- {
- cin>>hex>>x;
- a[i]=x;
- }
- for(int i=0;i<n;i++)
- {
- cout<<setbase(8)<<a[i]<<endl;
- }
- return 0;
- }
- #include <bits/stdc++.h>
- using namespace std;
-
- int main()
- {
- cout<<setw(25)<<256<<endl;//前面有25-3=22个空格
- cout<<setfill('9')<<setw(10)<<256;//前面有7个9
- }
用到队列(有时会用到优先队列)
主要思想:把所有符合条件的点都压入队列,然后挨个元素弹出上下左右前后搜索,直到队列清空时代表搜索完毕,搜索的时候注意判断是否已经搜索过,用bool vis【】判断。
例题1:全球变暖
例题2:跳马
用到递归(不好理解)
主要模板:可参见如下全排列例题
(1)确定 边界 if()return;
(2)进入for循环
(3)判断是否搜索过 if(vis[])vis[]=true; dfs(); vis[]=false;
DFS例题合集(不定时更新):
最大公约数
- #include <bits/stdc++.h>
- using namespace std;
- int a,b;
- int main()
- {
- scanf("%d%d",&a,&b);
- for(int i=min(a,b);i>=1;i--)
- {
- if(a%i==0&&b%i==0)
- {
- printf("%d",i);
- break;
- }
- }
- return 0;
- }
最小公倍数
- #include <bits/stdc++.h>
- using namespace std;
- int a,b;
- int main()
- {
- scanf("%d%d",&a,&b);
- for(int i=1;i<=a*b;i++)
- {
- if(i%a==0&&i%b==0)
- {
- printf("%d",i);
- break;
- }
- }
- return 0;
- }
最大公约数
- #include <bits/stdc++.h>
- using namespace std;
-
- int main()
- {
- cout<<__gcd(25,5);
- return 0;
- }
最小公倍数
多写一个lcm函数
- #include <bits/stdc++.h>
- using namespace std;
-
- int lcm(int a,int b)
- {
- return a*b/__gcd(a,b);
- }
- int main()
- {
- cout<<lcm(25,5);
- return 0;
- }
例题:无聊的逗
例题1:拿金币
例题2:包子凑数
思路:选取局部最优解,但是最大的缺陷就是在某些情况下不适用
举例:纸币问题
比如面额有1元,2元,5元,10元,20元,50元,100元,那么对于110元来说,可以用贪心从最大面额100元开始找。
但是如果改纸币面额,比如1元,2元,5元,20元,55元,100元,那么如果用到贪心算法,会发现并不能找出最优解(贪心:100+5+5=110 动态规划:55+55=110)
动态规划代码如下:
- #include <bits/stdc++.h>
- using namespace std;
-
- int dp[10000];
- int n;
- int b[6]={1,5,20,50,55,100};
- int temp;
- int main()
- {
- dp[0]=0;
- dp[1]=1;
- dp[5]=1;
- dp[20]=1;
- dp[50]=1;
- dp[55]=1;
- dp[100]=1;
- for(int i=1;i<=10000;i++)
- {
- temp=10000;
- for(int k=0;k<6;k++)
- {
- if(i>=b[k])
- {
- temp=min(dp[i-b[k]]+1,temp);
- }
- }
- dp[i]=temp;
- }
- for(int i=1;i<10000;i++)
- {
- cout<<i<<"元用"<<dp[i]<<"张"<<endl;
- }
- return 0;
- }
大部分是二分法
求不了子数字,但能求子字符串
例题:超级质数
是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。
在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。
使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。
递归的重点是找到递归表达式
例1:阶乘
- #include <bits/stdc++.h>
- using namespace std;
- int f(int n)
- {
- if(n==1)
- {
- return 1;
- }
- return n*f(n-1);
- }
- int main()
- {
- cout<<f(10);
- return 0;
- }
例2:汉诺塔
例3:斐波那契数列
快速查找某区间内的最大值
找子串的最快方法
最长上升子序列+最长公共子序列
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。