hdu1058 优先队列与map判重、 补充手动堆排序做法、

#include <iostream>
#include <queue>
#include <map>
#include <cstring>
using namespace std;
priority_queue<long long,vector<long long>,greater<long long> >q;//优先队列,值小的元素优先
map<long long,bool> mark;//map判重
int main()
{
    string sign;
    long long js=1,re[5843],fx[4]={2,3,5,7};//re 存储结果
    re[1]=1;
    for(int i=0;i<4;i++)
    q.push(fx[i]);
    for(;js<=5842;)
    {
        long long t=q.top();
        q.pop();
        re[++js]=t;
        for(int i=0;i<4;i++)
        {
            long long tmp=t*fx[i];
            if(!mark[tmp])
            {
                mark[tmp]=true;//修改重复标记
                q.push(tmp);
            }
        }
    }
    int n;
    while(cin>>n)
    {
        if(n==0) break;
        if(n%10==1&&n%100!=11)sign="st";
        else if(n%10==2&&n%100!=12)sign="nd";
        else if(n%10==3&&n%100!=13)sign="rd";
        else sign="th";
        cout<<"The "<<n<<sign<<" humble number is ";
        cout<<re[n]<<"."<<endl;
    }
}


下面是堆排序的做法:

#include <iostream>
#include <map>
#include <string>
using namespace std;
long long heap[90000];//建数组保存堆元素
int hlength;//保存堆的元素个数
void down(int p)
{
       //向下调整算法,p代表当前节点,q代表子节点
       int q=p*2;
       long long a=heap[p];//保存当前节点的值
       while (q<=hlength)
       {
              if (q<hlength&&heap[q]>heap[q+1])
              //选择两个子节点中的一个最小的
                        q++;
              if(heap[q]>=a) break;//如果子节点比当前节点大,就结束
              else//否则就交换
              {
                     heap[p]=heap[q];
                     p=q;
                     q=p*2;
              }
       }
       heap[p]=a;//安排原来的节点
}
void up(int p)
{
       //向上调整算法,p代表当前节点,而q代表父母节点
       int q=p/2;//获取当前节点的父母节点
       long long a=heap[p];//保存当前节点的值
       while (q<=hlength&&a<heap[q])
       {
              //如果当前节点的值比父母节点的值小,就交换
              heap[p]=heap[q];
              p=q;
              q=p/2;
       }
       heap[p]=a;//最后安排原来的节点
}
void insert(long long a)
{
       heap[++hlength]=a;//先往堆里插入节点值
       up(hlength);//进行向上调整
}
long long getmin()
{
//删除最小元素算法
       long long r=heap[1];//取出最小的元素
       heap[1]=heap[hlength--];//然后把最后一个叶子节点赋给根节点
       down(1);//调用向下调整算法
       return r;
}
void build()
{
//建堆算法
       for(int i=hlength/2;i>0;i--)
                  down(i); //从最后一个非终端节点开始进行调整
}
int main()
{
    map<long long,bool> mark;
    string sign;
    hlength=4;
    long long re[5843];
    re[1]=1;
    int n,js=1;
    heap[1]=2;heap[2]=3;
    heap[3]=5;heap[4]=7;
    int fx[4]={2,3,5,7};
    while(js<5842)
    {
        long long tmp=getmin();
        re[++js]=tmp;
        for(int i=0;i<4;i++)
        {
            long long t=tmp*fx[i];
            if(!mark[t])
            {
                mark[t]=true;
                insert(t);
            }
        }
    }
    while(cin>>n)
    {
        if(n==0) break;
        if(n%10==1&&n%100!=11)sign="st";
        else if(n%10==2&&n%100!=12)sign="nd";
        else if(n%10==3&&n%100!=13)sign="rd";
        else sign="th";
        cout<<"The "<<n<<sign<<" humble number is ";
        cout<<re[n]<<"."<<endl;
    }
}


你可能感兴趣的:(算法,String,Build,insert,UP,include)