博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uvalive3983Robtruck
阅读量:5250 次
发布时间:2019-06-14

本文共 1586 字,大约阅读时间需要 5 分钟。

题意:有n个垃圾,第i个垃圾坐标为(xi,yi)。有一个机器人按照编号从小到大哦捡起所有的垃圾并扔进垃圾桶,垃圾桶再远点。机器人手中垃圾总重量不能超过C,两点之间的距离为曼哈顿距离,求机器人行走的最短总路程

分析:d[i]=min{d[j]+dist2origin(j+1)+dist(j+1,i)+dist2origin(i)|j<=i, w(j+1,i)<=c}

里面可以写成函数f以简化计算

代码:

View Code
1 #include 
2 #include
3 using namespace std; 4 const int MAXN = 100000 + 10; 5 int x[MAXN], y[MAXN]; 6 int total_dist[MAXN], total_weight[MAXN], dist2origin[MAXN]; 7 int q[MAXN], d[MAXN]; 8 #define DEBUG 9 int func(int i){10 return d[i]-total_dist[i+1]+dist2origin[i+1];11 }12 13 int main(){14 #ifndef DEBUG15 freopen("in.txt", "r", stdin);16 #endif17 int T, c, n, w, front, rear;18 scanf("%d", &T);19 while(T--){20 scanf("%d%d", &c, &n);21 total_dist[0] = total_weight[0] = x[0] = y[0] = 0;22 int i;23 for(i=1; i<=n; i++){24 scanf("%d%d%d", &x[i], &y[i], &w);25 dist2origin[i] = abs(x[i])+abs(y[i]);26 total_dist[i] = total_dist[i-1] + abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);27 total_weight[i] = total_weight[i-1] + w;28 }29 front = rear = 1;30 for(i=1; i<=n; i++){31 while(front<=rear && total_weight[i]-total_weight[q[front]]>c) front++;32 d[i]=func(q[front])+total_dist[i]+dist2origin[i];33 while(front<=rear && func(i)<=func(q[rear])) rear--;34 q[++rear] = i;35 }36 printf("%d\n", d[n]);37 if(T>0) printf("\n");38 }39 return 0;40 }

今天感觉做题目不很在状态,直接看了训练指南上的分析。。

转载于:https://www.cnblogs.com/zjutzz/archive/2013/02/15/2912718.html

你可能感兴趣的文章
Spring3.0 AOP 具体解释
查看>>
我的Hook学习笔记
查看>>
EasyUI DataGrid 中字段 formatter 格式化不起作用
查看>>
海量数据存储
查看>>
js中的try/catch
查看>>
[导入]玫瑰丝巾!
查看>>
自动从网站上面下载文件 .NET把网站图片保存到本地
查看>>
【识记】 域名备案
查看>>
STL uva 11991
查看>>
MY SQL的下载和安装
查看>>
自定义OffMeshLink跳跃曲线
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
简述spring中常有的几种advice?
查看>>
学习Redux之分析Redux核心代码分析
查看>>
ABAP 创建和调用WebService
查看>>
C# 实例化顺序
查看>>
CSS水平垂直居中总结
查看>>
委托又给我惹麻烦了————记委托链的取消注册、获取返回值
查看>>
ps怎么把白色背景变透明
查看>>
gource 安装教程
查看>>