随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

有n个垃圾,第i个垃圾的坐标为(xi,yi),重量为wi。

有一个机器人,要按照编号从小到大的顺序捡起所有垃圾并扔进垃圾桶(垃圾桶在原点(0,0))。

机器人可以捡起几个垃圾以后一起扔掉,但任何时候其手中的垃圾总重量不能超过最大载重C。两点间的行走距离为曼哈顿距离(即横坐标之差的绝对值加上纵坐标之差的绝对值)。

求出机器人行走的最短总路程(一开始,机器人在(0,0)处)

 

 f[ i ] =max( f[ j ] + D0(i)-D0(j+1) + sumD(i) -sumD(j+1) )   sumw[i]-sumw[j+1] <=C

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
 const int N=1e5+2;
 int C,n,s[N],f[N],dis[N],x[N],y[N],sw[N];
  
 int F(int i){
    return f[i]-s[i+1]+dis[i+1];
 }
 int hh,tt,q[N];
  
 void solve(){
    cin>>C>>n;
    int i,z;
     for(i=1;i<=n;i++){
         cin>>x[i]>>y[i]>>z;
         dis[i]=abs(x[i])+abs(y[i]);
         s[i]=s[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);
         sw[i]=sw[i-1]+z;
      }
    hh=1,tt=0; q[++tt]=0;
     
    for(i=1;i<=n;i++){
        while(hh<=tt&&sw[i]-sw[q[hh]]>C) hh++;
        f[i]=F(q[hh])+s[i]+dis[i];
         
        while(hh<=tt&&F(i)<=F(q[tt])) tt--;
        q[++tt]=i ;
    }
    cout<<f[n]<<endl;
 }
 signed main(){
    int cas;
    cin>>cas;
    while(cas--){
        solve();
        if(cas) cout<<endl;
     }
  
}

 

posted on   towboat  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示