题解 | #追求女神#

追求女神

https://ac.nowcoder.com/acm/contest/11173/A

c题题解,将x化为pk+b的形式。按照k进行分组,然后用map统计每组的数量。然后根据k的移动,确定index的最后三次排序得出结果

#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<ll,ll> num;
ll ss[10000100];
int main()
{
    ll n,k,p;
    ll maxs=-9223372036854775808;
    scanf("%lld%lld%lld",&n,&k,&p);

    for(ll i=0;i<n;i++)
    {
        ll x,s;
        scanf("%lld",&x);
        ss[i]=x;
        if(p!=0)
            s=x/p;//把x化为ps+b处理
        maxs=max(s,maxs);
        num[s]++;
    }
    if(p==0)
    {
        sort(ss,ss+n);
        for(ll i=0;i<n;i++)
        {
            printf("%lld",ss[i]);
            if(i==n-1)
                printf("\n");
            else
                printf(" ");
        }
        return 0;
    }
    ll index=maxs;
    ll last=0;
    while(1)
    {
        if(k>num[index])
        {
            k=k-num[index];
            num[index-1]+=num[index];
            last=num[index];
            num.erase(index);
            index--;//
        }
        else
            break;
    }
    sort(ss,ss+n);
    ll fir=lower_bound(ss, ss+n, index*p)-ss;
    fir=fir+num[index]-k-1;
    for(ll i=n-last;i<n;i++)
    {
        ss[i]=ss[i]%p+(index)*p;
    }
    sort(ss,ss+n);
    for(ll i=n-1;i>=n-k;i--)
    {
        ss[i]-=p;
    }
    sort(ss,ss+n);
    for(ll i=0;i<n;i++)
    {
        printf("%lld",ss[i]);
        if(i==n-1)
            printf("\n");
        else
            printf(" ");
    }
    return 0;
}
全部评论

相关推荐

rbjjj:太杂了吧,同学,项目似乎都没深度,都是api调度耶,分层架构思想没有体现出来了,前端没有前端优化前端工程化体现,后端微服务以及分层架构没体现以及数据安全也没体现,核心再改改,注重于计算机网络,工程化,底层原理吧
点赞 评论 收藏
分享
牛客36400893...:我不是这个专业的,但是简历确实没有吸引我的亮点,而且废话太多没耐心看
0offer是寒冬太冷还...
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务