K路归并 例题

来源:互联网 发布:淘宝女装海报设计 编辑:程序博客网 时间:2024/06/07 11:18

例题传送门
//有m种商品, 每一种商品有多个值, 然后要从每一种商品中选出一个值组成一个类型, 类型值为选出的商品值的sum. 问前k小个的值是多少.
//k路归并的典型例题, 把全部进行组合, 再排序输出前k个时不可能的, 因为组合达到了100^100次方个数, 但是这类题的关键在于k不大, 这里只有100, 所以每次进行两两组合时, 我们始终都只要前k个, 这样既能保证答案保存下来了, 而数的数量也不会很多. 这样的问题有很多也很经典.

AC Code

const int maxn = 1e2+5;int n,cas=1;int ans[maxn],a[maxn];void solve(){    int m,k;    scanf("%d%d",&m,&k);    priority_queue<int,vector<int>,greater<int> >q;//小根堆.    int n; scanf("%d",&n);    for(int i=1;i<=n;i++){        int u; scanf("%d",&u);        q.push(u);    }    int idx = 0;    for(int i=1;i<=min(k,n);i++){        ans[++idx] = q.top();        q.pop();    }    for(int i=2;i<=m;i++){        scanf("%d",&n);        for(int j=1;j<=n;j++){            scanf("%d",&a[j]);        }        sort(a+1,a+1+n);        while(!q.empty()) q.pop();        for(int j=1;j<=idx;j++){            for(int tt=1;tt<=n;tt++){                q.push(ans[j]+a[tt]);            }        }        idx = 0;        for(int j=1;j<=k;j++){            ans[++idx] = q.top();            q.pop();        }    }    for(int i=1;i<=idx;i++){        printf("%d%c",ans[i],i==k?'\n':' ');    }}
原创粉丝点击