1. 程式人生 > >【洛谷P1230】智力大沖浪

【洛谷P1230】智力大沖浪

題目大意:給定 N 項任務,每項任務有一個截至完成時間,若在截止時間之後完成要罰款 \(w_i\) 元,最初有 M 元,怎樣完成能夠留下最多得錢。

題解:按照罰款從多到少貪心,在查詢能夠最晚完成一項任務的時間時,可以採用並查集優化,即:建立一個時間上的並查集,每次在某個時間完成一項任務時,合併當前時間和前一個時間,這樣每次查詢時省去了一個迴圈的時間。

程式碼如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=510;

int n,m,f[maxn];
struct node{int t,w;}e[maxn];
bool vis[maxn];

int find(int x){
    return x==f[x]?x:f[x]=find(f[x]);
}

bool cmp(const node& x,const node& y){
    return x.w>y.w;
}

void read_and_parse(){
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)scanf("%d",&e[i].t);
    for(int i=1;i<=n;i++)scanf("%d",&e[i].w),f[i]=i;
    sort(e+1,e+n+1,cmp);
}

void solve(){
    for(int i=1;i<=n;i++){
        int fa=find(e[i].t);
        if(!fa)m-=e[i].w;
        else f[fa]=fa-1;
    }
    printf("%d\n",m);
}

int main(){
    read_and_parse();
    solve();
    return 0;
}