PAT 1129 Recommendation System STL的使用

题意:逐步观察 输出当前出现次数最多的k个数字 按出现次数大小排序 次数相同 序号小的大

1. 码力倒退的太严重了 没有想明白用Node怎么建立索引 搜题解才知道不用建立结构体数组 直接把一个值作为索引 另外一个值放在数组外面然后放到容器中查询即可

2. 刚开始总想着用数组 但是sort自然不可能 手写插入排序在顺序表中也不方便维护 写链表更是石乐志 后来想用优先队列 但是优先队列取出元素的操作太复杂 也不能做 只能用set

#include <bits/stdc++.h>

using namespace std;
const int N=50100;
int arr[N],tim[N];
struct Node{
    int id;
    int num;
    Node(){}
    Node(int a,int b){id=a;num=b;}
    bool operator<(const Node&b)const{
        if(num==b.num)
            return id<b.id;
        return num>b.num;
    }
};

/*
    当前出现次数最多的k个数字 按出现次数大小排序
    次数相同 序号小的大
*/
int main()
{
    int n,k;
    set<Node>st;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    memset(tim,0,sizeof(tim));
    tim[arr[0]]++;
    st.insert(Node(arr[0],tim[arr[0]]));
    for(int i=1;i<n;i++)
    {
        printf("%d:",arr[i]);
        int cnt=0;
        for(auto it=st.begin();it!=st.end()&&cnt!=k;++it)
        {
            ++cnt;
            printf(" %d",it->id);
        }
        printf("\n");
        auto it = st.find(Node(arr[i],tim[arr[i]]));
        if(it!=st.end())st.erase(it);
        tim[arr[i]]++;
        st.insert(Node(arr[i],tim[arr[i]]));
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值