哈理工acm1585公主之魔镜魔镜 二叉堆及其应用

int heapsort(int heap[],int sizeheap)//堆排序部分 本题未应用
{
    int i,t;
    for(i=sizeheap;i>=2;i--)
    {
        t=heap[sizeheap];
        heap[sizeheap]=heap[1];
        heap[1]=t;
        sizeheap=sizeheap-1;
        maxheap (heap, sizeheap, 1);
    }
}

 

公主之魔镜魔镜

 

Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 45(18 users)Total Accepted: 23(16 users)Rating: Special Judge: No
Description

    公主大病一场后变得很虚弱,总是感冒发烧什么的。公主的亲姐为了哄公主开心,就给了公主一个魔镜,并在魔镜中放了许多装有糖果的瓶子。魔镜是很神奇的,它有一个魔法就是能够以最快的速度把魔镜中装有最多糖的瓶子给公主,公主每次都吃 K 颗糖后就把糖瓶放回魔镜中

Input

   输入数据有多组。     第一行给出公主的亲姐一开始放进魔镜中的瓶数 n (0 <= n <= 5000)和公主拿糖的次数

m (0 <= m <= 10000)以及公主每次吃 k (0 <= k <= 500)颗糖。     接下来n个数表示n个瓶中糖的颗数。     保证输入数据合法,即不会出现瓶子中糖的颗数比公主每次吃的要少的情况。

Output
    对于每组测试数据,输出 m 个整数并占一行,每个整数中间用一个空格隔开, 表示公主 m 次取糖过程中,每次魔镜给的装有最多糖的瓶子中糖的个数。
Sample Input
10 6 3 15 7 3 12 8 6 9 5 4 8

 

Sample Output
15 12 12 9 9 9

 

本题ac代码
应用堆构建
#include<stdio.h> #include<stdlib.h> int key; int maxheap(int *heap,int sizeheap,int k)//维护堆 { int maxn,t; int left=2*k; int right=2*k+1; if((left<=sizeheap)&&(heap[left]>heap[k])) maxn=left; else maxn=k; if((right<=sizeheap)&&(heap[right]>heap[maxn])) maxn=right; if(k!=maxn) { t=heap[k]; heap[k]=heap[maxn]; heap[maxn]=t; maxheap (heap, sizeheap, maxn); } } int buildheap(int *heap,int sizeheap)//建立堆 { int i; for(i=sizeheap/2;i>=1;i--) maxheap (heap, sizeheap, i); } int inheap(int *heap,int &sizeheap)//堆的插入 { int k=++sizeheap,t; heap[k]=key; while((k>1)&&(heap[k]>heap[k/2])) { t=heap[k]; heap[k]=heap[k/2]; heap[k/2]=t; k=k/2; } } int putheap(int heap[],int sizeheap)//出堆 { int head=heap[1]; int t; t=heap[sizeheap]; heap[sizeheap]=heap[1]; heap[1]=t; sizeheap=sizeheap-1; maxheap (heap, sizeheap, 1); } int main() { int n,m,k,i; int a[6000]; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { for (i=1; i<=n; ++i) { scanf("%d",&a[i]); } buildheap(a,n); for (i=n/2; i>=1; --i) { maxheap(a,n,i); } for(i=0;i<m;i++) { putheap(a,n); int q=a[n]; if(a[n]<0) q=0; printf("%d",q); if(i!=m-1)printf(" "); else printf("\n"); a[n]=a[n]-k; key=a[n]; --n; maxheap(a,n,1); inheap(a,n); } } return 0; }

转载于:https://www.cnblogs.com/zzm588/archive/2012/12/09/2810293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值