1. 程式人生 > >CF--994B. Knights of a Polygonal Table

CF--994B. Knights of a Polygonal Table

題意:

n個戰士,每個人最多掠奪k個人的金幣,只能掠奪戰鬥力比他低的人的,給出n個人的戰鬥力值和金幣數,輸出每個人做多能夠得到的金幣數

思路:

因為是兩個順序,所以想著用set,但是不太熟練,WA+3才終於Adam,比賽結束後聽說sort也能A,。,,畢竟k《=10.。。

程式碼:

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,b[100005],ans[100005],x,num[100005];
struct AA
{
    long long x,id,y;
    bool operator<(const AA &aa) const
    {
        return x<aa.x;
    }
}a[100005];
multiset<long long>s;
multiset<long long>::iterator it;
int main()
{
    scanf("%I64d%I64d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%I64d",&a[i].x);
        a[i].id=i;
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%I64d",&a[i].y);
    }
    sort(a+1,a+n+1);
    m++;
    for(int i=1;i<=n;i++)
    {
        if(i<=m)
        {
            s.insert(a[i].y);
            num[i]=num[i-1]+a[i].y;
        }
        else
        {
            s.erase(s.begin());
            num[i]=a[i].y;
            for(it=s.begin();it!=s.end();it++)
            {
                num[i]+=*it;
            }
            s.insert(a[i].y);

        }
        ans[a[i].id]=num[i];
    }
    for(int i=1;i<n;i++)
        printf("%I64d ",ans[i]);
    printf("%I64d\n",ans[n]);
}