洛谷 P2085 最小函数值 最小堆

洛谷 P2085 最小函数值 最小堆

代码如下:

#include<stdio.h>
#include<iostream>
#include<vector>
#include<math.h>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;

int n,m,a[10005],b[10005],c[10005];
int f[10005];//f[i]的值是第i个函数的当前的x的值,x是从1开始递增的

struct node{
    int val;//箭头表示的函数值
    int k;//每个函数都有被输入进来的先后顺序,这个是第k个输入进来的函数
        //因为堆里面的节点总是在变化的,所以我们要记录哪个函数在哪个位置
}p[10005];

void swap_func(int a,int b){//交换两个结点的信息
    int t1,t2;
    t1=p[a].val,t2=p[a].k;
    p[a].val=p[b].val;
    p[a].k=p[b].k;
    p[b].val=t1;
    p[b].k=t2;
}

void min_heapify(int i,int h){
    int l=2*i;
    int r=2*i+1;
    int smallest=i;
    if(l<=h&&p[l].val<p[i].val){
        smallest=l;
    }
    if(r<=h&&p[r].val<p[smallest].val){
        smallest=r;
    }
    if(smallest!=i){
        swap_func(smallest,i);
        min_heapify(smallest,h);
    }
}


int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
        f[i]=1;
        p[i].val=a[i]*f[i]*f[i]+b[i]*f[i]+c[i];
        p[i].k=i;
    }

    for(int i=n/2;i>0;i--){//建堆
        min_heapify(i,n);
    }

    for(int i=0;i<m;i++){
        printf("%d ",p[1].val);
        f[p[1].k]++;
        p[1].val=a[p[1].k]*f[p[1].k]*f[p[1].k]+b[p[1].k]*f[p[1].k]+c[p[1].k];
        min_heapify(1,n);
    }
    return 0;
}
发布了253 篇原创文章 · 获赞 15 · 访问量 7997

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/103882150