LA 3983 - Robotruck
7746 ワード
に言及
1つの掃除ロボットは順番にすべてのごみを収集して、最小のステップ数を求めます
グループ数T
ロボット容量Cap
ごみの数n
ごみ座標と重量x y c
てんいほうていしき
\( d(i)=min\{d(j)+dis2org(j+1)+dis(j+1,i)|j(dis(j+1,i)=dis(i)−dis(j))とすると、(d(i)=min{d(j)+dis 2 org(j+1)−dis(j+1)}+dis(i)+dis 2 org(i))となる
1つの掃除ロボットは順番にすべてのごみを収集して、最小のステップ数を求めます
グループ数T
ロボット容量Cap
ごみの数n
ごみ座標と重量x y c
てんいほうていしき
\( d(i)=min\{d(j)+dis2org(j+1)+dis(j+1,i)|j(dis(j+1,i)=dis(i)−dis(j))とすると、(d(i)=min{d(j)+dis 2 org(j+1)−dis(j+1)}+dis(i)+dis 2 org(i))となる
1 /*
2 author:jxy
3 lang:C/C++
4 university:China,Xidian University
5 **If you need to reprint,please indicate the source**
6 */
7 #include <iostream>
8 #include <cstdio>
9 #include <cstdlib>
10 #include <cstring>
11 #include <algorithm>
12 using namespace std;
13 int Cap,n;
14 int dis2org[100005]; //
15 int dis[100005],cap[100005];// 0 i
16 int abs(int x){return x>0?x:-x;}
17 int ans[100005];
18 int que[100005];
19 int calc(int i)
20 {
21 return ans[i]+dis2org[i+1]-dis[i+1];
22 }
23 int main()
24 {
25 int T;
26 scanf("%d",&T);
27 while(T--)
28 {
29 scanf("%d%d",&Cap,&n);
30 int i,x,y,c,lx=0,ly=0,l,r;
31 dis[0]=cap[0]=0;
32 for(i=1;i<=n;i++)
33 {
34 scanf("%d%d%d",&x,&y,&c);
35 dis2org[i]=abs(x)+abs(y);
36 cap[i]=cap[i-1]+c;
37 dis[i]=dis[i-1]+abs(x-lx)+abs(y-ly);
38 lx=x;ly=y;
39 }
40 l=r=0;
41 ans[0]=0;
42 for(i=1;i<=n;i++)
43 {
44 while(l<r&&cap[i]-cap[que[l]]>Cap)l++;
45 while(l<r&&calc(i-1)<=calc(que[r-1]))r--;//
46 que[r++]=i-1;
47 ans[i]=calc(que[l])+dis[i]+dis2org[i];
48 }
49 printf("%d
",ans[n]);
50 if(T)puts("");
51 }
52 }