题解 | #追求女神#

追求女神

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;
}
全部评论

相关推荐

05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
嵐jlu:我是山川🐔里🐔🧱的,阿里系简历全过; 你这简历一看就还是半成品啊,没有荣誉经历奖项什么的吗?
投递阿里巴巴集团等公司8个岗位
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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