依舊是自閉的一場比賽html
使用優先隊列node
好比樣例ide
4 7 5 5 2 1 3 2 1 2 7 1 4 5
(請你們本身加上點權(滑稽idea
把能遍歷的點的邊權丟進隊列。spa
這樣先走到3,收集到5的貨物,須要武力值2.net
貨物不夠,又走到4,收集到2的貨物,總貨物爲7 ,須要武力值5。貨物夠了,那麼答案就是5。code
namespace Sol{ struct node{ int v,to,net; }e[maxn<<1]; int n,M,tot,ans,cnt; int head[maxn],a[maxn]; bool vis[maxn]; priority_queue<pair<int,int> >q; inline void add(int x,int y,int z){ e[++tot].v=y; e[tot].to=z; e[tot].net=head[x]; head[x]=tot; } inline int Main(){ n=read(); M=read(); for(int i=2;i<=n;i++) a[i]=read(); for(int i=1;i<n;i++){ int x=read(),y=read(),z=read(); add(x,y,z); add(y,x,z); } vis[1]=1; for(int i=head[1];i;i=e[i].net){ int y=e[i].v; vis[y]=1; q.push(make_pair(-e[i].to,y)); } while(ans<M){ int x=-q.top().first;//武力值 int y=q.top().second;//走到的節點 q.pop(); ans+=a[y];//收集到的總貨物 cnt=max(cnt,x);//比較武力值 for(int i=head[y];i;i=e[i].net){ int yy=e[i].v; if(vis[yy]) continue; vis[yy]=1; q.push(make_pair(-e[i].to,yy)); } } printf("%d",cnt); return 0; } }
這裏有篇博客和我思路差很少,但奈何個人常數比較優秀?htm
爲何帖博客?由於我比較懶blog
namespace Sol{ int n,M; int f[maxn],s[maxn],a[maxn]; int maxx,minn; inline int Main(){ n=read(); M=read(); for(int i=1;i<=n;i++){ a[i]=read(); s[i]=s[i-1]+a[i]; } for(int i=1;i<=n;i++){ f[i]=f[i-1]-s[i-1]; maxx=a[i]; minn=a[i]; for(int j=i-2;j>=0&&s[j]>=s[i]-M;j--){ maxx=max(maxx,a[j+1]); minn=min(minn,a[j+1]); if(f[i]>f[j]-s[j]+maxx-minn) f[i]=f[j]-s[j]+maxx-minn; } f[i]+=s[n]; } printf("%lld",f[n]); return 0; } }
未寫,等待更新
\[ \mathcal The \quad End \]隊列
\[ 願你走出半生,還還是少年 \]