题目内容大概:
一个快递机器人在(0,0),快递按顺序来,这些快递要分别放到(xi,yi),但是他一次只能拿总重量小于w,机器人要按顺序送。
1
10
4
1 2 3
1 0 3
3 1 4
3 1 4
//dp[i]保存送了第i个快递并且回到原点后走过的路径长度
//dist[i]保存从原点出发,一直到i走过的路径长度
///d[i]保存从原点直接到i的路径长度
//weight[i]保存1到i的总重量
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
int x[MAXN],y[MAXN],w[MAXN];
int dp[MAXN]={0},dist[MAXN]={0},d[MAXN]={0},weight[MAXN]={0};
int q[MAXN];
int func(int i){
return dp[i]-dist[i+1]+d[i+1];
}
void init(){
memset(dp,0,sizeof(dp));
memset(dist,0,sizeof(dist));
memset(d,0,sizeof(d));
memset(weight,0,sizeof(weight));
}
int main(){
int t;
cin>>t;
while(t--){
int c,n;
init();
cin>>c>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>w[i];
d[i]=abs(x[i])+abs(y[i]);
dist[i]=dist[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);
weight[i]=weight[i-1]+w[i];
}
int front=1,rear=1;
for(int i=1;i<=n;i++){
while(front<=rear&&weight[i]-weight[q[front]]>c) front++;
dp[i]=func(q[front])+dist[i]+d[i];
while(front<=rear&&func(i)<=func(q[rear])) rear--;
q[++rear]=i;
}
cout<<dp[n]<<endl;
if(t) puts("");
}
return 0;
}