依旧是自闭的一场比赛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 \]队列
\[ 愿你走出半生,还还是少年 \]