贪心总结:
记得:这里面的代码都是小写字母
那些个大写的字母是自己变得;没有改。
然后就是 c++ 提交问题都用c++ c++可以编译c 但是c,没办法编译c++
后面做题 会用到 sort() 和 优先队列;
第一: sort()函数的使用;
1: 头文件: #include<algorithm>
Using namespace std;
结构体的排序:
先写一个简单的结构体
#include<stdio.h>
#include<algorithm>
Using namespace std;
Struct node {
int x;
Int y;
}p[100];
对他排序:
#include<stdio.h>
#include<algorithm>
Using namespace std;
Struct node {
int x;
Int y;
}p[100];
Int cmp(node a,node b){
Return a.x>b.x; // 按照 x的大小来对结构体排序 减序; return a.x<b,y 是增序
}
Int main(){
Sort(p,p+n,cmp);// n代表 你要排序的这个结构体的长度;cmp 是函数 用来写是递增还是递减;
Return 0;
}
// 在排序时候还会想要 如果 结构体的X 相同按照什么排序 也可以自己设计;
Int cmp(node a,node y){
If(a.x==b.x)
Return a.y<b.y;
Else return a.x<b.x; // 这一段是 如果结构体的x一样的话 那么按照 结构体 的y 来判断, 跟上面一样 a.y<b.y 如果x相同 那么按照y从小到大排序;
}
数组的排序:
数组的排序 头文件和其他的不写了
Int a[100];
Sort(a,a+n); //直接写的话是从小到大的排序;
Sort(a,a+n,cmp); // 想要从大到小排序 也要写函数;
// 函数
Int cmp(int x,int y){
return x>y; //这个是从大到小;
}
第二: 优先队列:
优先队列:有一个比较好的功能是 自动排序; 只要队列出现数字的变动 他就会自动排一次序;
用他需要头文件:
#include<queue>
#include<vector>
Using namespace std;
Int main(){
Priority_queue<int,vector<int>,greater<int> > q ; //这个是一个格式 定义优先队列的
//目前我只会这一种;
q.push(); //功能是 向队列里添加一个数字; //greater 代表着队列的数字顺序是从小到大
q.pop(); // 删除队列里的第一个数字 // 从大到小要改写为less
q.top(); //取出队列里的第一个数字
q.size(); // 队列的长度
q.empty(); //如果队列为空 就返回真;
}
队列使用:
想要取出队列的第一个数字并输出;
Int first;
First=q.top();
其他的同理;
这个用来解决的问题: 如果一个问题 是让你每次都取很多数字中最小的两个数相加,然后把这两个数字删去,在把他们相加的和给放进这些个数字中,继续操作,知道只剩下一个数字;
这个问题:第一 每次取最小的两个数字相加, 肯定要排序;从小到大的排;
第二 删去这两个数字,添加这两个数字之和进入;肯定还要排序,删去数字,又添加数字,无法保证这两个数字之和还是最小的那个;
所以要用有限队列,每次有数字变动 都会自动排序:
代码实现:
第一 :创建队列 并设置了排序 priority_queue<int,vector<int>,greater<int> >q;
第二 :取数字 int temp1;
Int temp2;
Temp1=q.top(); //第一个数字
q.pop() //pop 删去第一个数字,那么队列头数字为最小的数字了;
temp2=q.top() //第二个数字
q.pop(); //再删去,队列的两个最小的数字删去了;
q.push(temp1+temp2); //添加最小的两个数之和进入队列;