牛客1102
写在前面
依旧是自闭的一场比赛
T1 货物收集
Idea
使用优先队列
比如样例
4 7
5 5 2
1 3 2
1 2 7
1 4 5
(请大家自己加上点权(滑稽
把能遍历的点的边权丢进队列。
这样先走到3,收集到5的货物,需要武力值2
货物不够,又走到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;
}
}
T2货物分组
Idea
这里有篇博客和我思路差不多,但奈何我的常数比较优秀?
为什么帖博客?因为我比较懒
Code
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;
}
}
T3地形计算
未写,等待更新
\[\mathcal The \quad End
\]
\[愿你走出半生,还仍是少年
\]
不随波,追随梦;不逐流,攀耸峰。不卑,补我所失;不亢,胜我所向。