P2085 最小函数值
P2085 最小函数值
题目简述
对于n个函数 ,在 x 均为正整数情况下,求这些函数值中最小的m个
思路
大水题,裸的堆,主要记录一下重载运算符写法以及结构体套优先队列到底是怎么写的qwq
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct Node{
int a,b,c;
}s[N];
struct node{
int id,op,num,x;
friend bool operator < (node x,node y) {
return x.num>y.num;//按照升序排列
}
};
priority_queue<node>q;
int main(){
freopen("2085.in","r",stdin);
freopen("2085.out","w",stdout);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i].a>>s[i].b>>s[i].c;
int x=-(s[i].b)/(2*s[i].a);
if(x<0){
q.push(node{i,1,s[i].a+s[i].b+s[i].c,1});
continue;
}
if(s[i].b%(2*s[i].a)==0){
q.push(node{i,0,s[i].a*x*x+s[i].b*x+s[i].c,x});
if(x-1>0)q.push(node{i,-1,s[i].a*(x-1)*(x-1)+s[i].b*(x-1)+s[i].c,x-1});
q.push(node{i,1,s[i].a*(x+1)*(x+1)+s[i].b*(x+1)+s[i].c,x+1});
}
else {
q.push(node{i,-1,s[i].a*x*x+s[i].b*x+s[i].c,x});
q.push(node{i,1,s[i].a*(x+1)*(x+1)+s[i].b*(x+1)+s[i].c,x+1});
}
}
int tmp=1;
while(tmp<=m){
int id=q.top().id,op=q.top().op,num=q.top().num,x=q.top().x;
q.pop();
if(x<=0)continue;
cout<<num<<' ';
tmp++;
if(op==1||op==-1){
q.push(node{id,op,s[id].a*(x+op)*(x+op)+s[id].b*(x+op)+s[id].c,x+op});
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律