贪心总结:

贪心总结:

 

记得:这里面的代码都是小写字母

      那些个大写的字母是自己变得;没有改。

然后就是 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); //添加最小的两个数之和进入队列;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值