标签:例题 return greater less 队列 CodeForces 854C 重载 include
(https://vjudge.net/contest/352426#problem/C)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXX 1005
struct node
{
int pos,cost,w;
}ant[300005];
bool operator < (node a,node b)
{
return a.cost<b.cost;
}
int main()
{
int n,k;
long long sum=0;
scanf("%d%d",&n,&k);
priority_queue<node,vector<node>,less<node> >qu;
for(int i=1;i<=n;i++)
{
scanf("%d",&ant[i].cost);
ant[i].pos=i;
if(i<=k)qu.push(ant[i]);
}
for(int i=k+1;i<=k+n;i++)
{
if(i<=n)qu.push(ant[i]);
node m=qu.top();qu.pop();
sum+=1LL*m.cost*(i-m.pos);
ant[m.pos].w=i;
}
printf("%lld\n",sum);
for(int i=1;i<=n;i++)
{
if(i<n)printf("%d ",ant[i].w);
else printf("%d\n",ant[i].w);
}
return 0;
}
这题用到了优先队列,关于自定义优先级:首先定义一个结构体struct node{int x,y;}w;
然后定义优先队列,容器里的元素是结构体w,priority_queue<w,vector<w>,greater<w> >qu1,priority_queue<w,vector<w>,less<w> >qu2;
优先队列里面的greater和less是针对标准数据类型来的,greater是从小到大,less是从大到小
优先队列里面默认是从大到小排序。我们如果要按照结构体w中的x的大小进行排序,就需要重载运算符:`
bool operator < (w a, w b){
return a.x < b.x;
}
bool operator > (w a, w b){
return a.x > b.x;
}
其中,大于号 > 的重载对应了greater的重载,是根据重载规则从小到大排序 小于号 < 的重载对应了less的重载,是根据重载规则从大到小排序 如果我在重载对应greater的大于符号的时候,返回的是小于的判定结论
bool operator > (w a, w b){
return a.x < b.x;
}
`
那么实现的就是从大到小的排序,对于less也是如此。
对于此题要注意:飞机不可以提前起飞,所以对于起飞时间大于k的飞机要一个一个地放入队列,边放入边使队首元素出队。
标签:例题,return,greater,less,队列,CodeForces,854C,重载,include 来源: https://blog.csdn.net/weixin_45502089/article/details/104079632
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。