【洛谷P1230】智力大沖浪
阿新 • • 發佈:2018-11-24
題目大意:給定 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; }