CF--994B. Knights of a Polygonal Table
阿新 • • 發佈:2018-12-31
題意:
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]); }