拼数
几数拼在一起 返回最大整数 采用字符串拼接的办法 定义类型为字符型
cmp函数 return a+b>b+a 注意cmp函数是bool类型
怎么统计数字出现次数
先排序,再依次遍历,如果后一个与前一个数字相同,cnt++.不同 就输出相应的个数
未知数据个数
用
while(scnaf("%d",%a[i])!=EOF){
i++; //i计算个数
}
停止输入的时候用 同时嗯ctrl+z 屏幕黑框中出现Z时按回车
就可以停止输入.!
排列 逐渐输出比自己大的数
用next_permutation()
函数
逐渐生成比现在排列大的
对字符串 字符串数组 和排列的想法
当确切知道几个数是 或者 有 字符串等于的运算时 用string a,b,c
不用数组
//等于 string a,b,c;
a=b; //直接写等于
//排列
next_permutation(a.begin(),a.end());
数组的写法
string a[100];
next_permutation(a,a+100)
int 把浮点数转化为小数 二分法
小数后面自动省略 不会四舍五入
关于二分法向上取整还是向下取整的问题
小经验 当题目要求取最大值的时候 向上取整
当题目要求取最小值的时候 向下取整
具体情况具体分析
详情请点击
最小值最大化/最大值最小化
在所有情况获得的最小值中取一个最大的/
二分法找一个最大值 / 二分法找一个最小值
实数二分的精度问题
eps实际上决定了二分的次数。例如区间长度为 1 ,要达到 eps=0.001的精度,那么共二分 10次,就能达到 1/(2的10次方)
=0.001 的精度
二分一次的意思:把区间长度为1 ,折一半---->二分一次
再折一半—>二分两次
for (int i=-100;i<100;i++){ //题目说「根与根之差的绝对值≥1”,分为200个小区间
double left = i, right =i+1;
double y1 = y(left), y2 = y(right);
if(y1 == 0) printf("%.2lf ",left); //判断左端点。一个小坑
if(y1*y2 < 0){ //小区间内有根
for(int j = 0; j<100; j++){ //在小区间内二分
double mid=(left+right)/2;
if(y(mid)*y(right) <= 0)
left = mid;
else
right = mid;
}
printf("%.2lf ",right);
}
广度优先搜索
当题目中要输出搜索次数是 可以把次数和坐标放在同一个结构体中
queue<node> q;
求最短路径问题
图的最短路径
数据范围大:dijkstra算法
数据范围小:floyd算法
#include<bits/stdc++.h>
using namespace std;
const int N = 5e2+10;
int dis[N][N];
void floyd(int n){
for(int k=1;k<=n;k++)//中间值
for(int i=1;i<=n;i++) //一共有n个数
for(int j=1;j<=n;j++)
dis[i][j] = min (dis[i][j],dis[i][k]+dis[k][j]);//算法核心!!!
}
int main(){
int n,m,q,inf=1e15;
cin>>n>>m>>q;
memset(dis,0x3f,sizeof(dis));
//赋值给dis数组
for(int i=1;i<=m;i++){
int u,v,w;
cin >> u >> v >> w;
dis[u][v] = dis[v][u] = min(dis[u][v],w);
}
for(int i=1;i<=n;i++) dis[i][i]=0;
floyd(n);
while(q--){
int u,v;
cin >> u >> v;
if(dis[u][v] > inf) cout<<-1<<endl;
else cout<<dis[u][v]<<endl;
}
return 0;
}
最小生成树适合解决什么问题?
最小生成树:都联通且不能有环
一个有N个点的图,边一定是大于等于N-1条的。图的最小生成树,就是在这些边中选择N-1条出来,连接所有的N个点。这N-1条边的边权之和是所有方案中最小的。
最小生成树用来解决什么问题?
就是用来解决如何用最小的“代价”用N-1条边连接N个点的问题。