图片加载可能有点慢,请跳过题面先看题解,谢谢


设状态 \(f[i][j]\) 为,当前垃圾序号为 \(i\) ,当前承重为 \(j\) 的最小路程,好的这道题做完了
O(NC) G烂
$
$
我们这样设: \(f[i]\) 为,从起点出发,将前 \(i\) 个垃圾清完并放进垃圾桶的最小路程
显然有转移:\(f[i]=min(f[j]+H[j+1]+dis[j+1][i]+H[i]),j\le i,sum[j+1][i]<=c\),其中,
\(sum[i][j]\) 为第 \(i\) 个垃圾到第 \(j\) 个垃圾的重量和,\(H[i]\) 为垃圾 \(i\) 到原点的距离,\(dis[i][j]\) 为从第 \(i\) 个垃圾出发,依次经过第 \(i+1,i+2...j\) 个垃圾的总路程
我们将上面的式子转换一下,设 \(t[i]\) 为,从第 \(1\) 个垃圾出发,依次经过第 \(2,3,4...i\) 个垃圾的总路程,
则有:\(dis[i][j]=t[j]-t[i]\)
所以:\(f[i]=min(f[j]-t[j+1]+H[j+1])+t[i]+H[i],sum[j+1][i]<=c\)
令:\(calc(j)=f[j]-t[j+1]+H[j+1]\),所以有:\(f[i]=min(calc(j))+t[i]+H[i],sum[j+1][i]<=c\)
这个式子。。。用什么数据结构都能维护。。。\(XJB\) 搞一下就能 \(AC\) 了
$
$
这里用到单调队列,时间复杂度:\(O(n)\)

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define N (100010)
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int T,n,c;
int x[N],y[N];
int t[N],S[N],H[N];
int que[N],f[N];il void init(){c=gi(),n=gi();for(RG int i=1;i<=n;i++){x[i]=gi(),y[i]=gi(); int w=gi();H[i]=abs(x[i])+abs(y[i]);t[i]=t[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);S[i]=S[i-1]+w;}
}il int calc(int x){return f[x]-t[x+1]+H[x+1];}il void work(){int hd=0,tl=0;for(RG int i=1;i<=n;i++){while(hd<=tl && S[i]-S[que[hd]]>c) hd++;f[i]=calc(que[hd])+t[i]+H[i];while(hd<=tl && calc(i)<=calc(que[tl])) tl--;que[++tl]=i;}printf("%d\n",f[n]); if(T)puts("");
}int main(){ T=gi(); while(T--){ init(); work(); } return 0; }

$
$
附,优先队列的代码,时间复杂度:\(O(nlogn)\)

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#define N (100010)
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int T,n,c;
int x[N],y[N];
int t[N],S[N],H[N];
int f[N];il void init(){c=gi(),n=gi();for(RG int i=1;i<=n;i++){x[i]=gi(),y[i]=gi(); int w=gi();H[i]=abs(x[i])+abs(y[i]);t[i]=t[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);S[i]=S[i-1]+w;}
}struct R{int id,x;il bool operator<(const R &a)const{return x>a.x;}
}a;
priority_queue<R>que;il void work(){ while(!que.empty()) que.pop(); que.push(a);for(RG int i=1;i<=n;i++){R x=que.top();while(!que.empty()&&S[i]-S[x.id]>c) que.pop(),x=que.top();f[i]=x.x+t[i]+H[i];que.push((R){i,f[i]-t[i+1]+H[i+1]});}printf("%d\n",f[n]); if(T)puts("");
}int main(){ T=gi(); while(T--){ init(); work(); } return 0; }

$
$
另附,在vjudge上跑的比STL还慢的手写堆代码:

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#define N (100010)
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int T,n,c;
int x[N],y[N];
int t[N],S[N],H[N];
int f[N],dis[N];struct heap{
#define fa (x>>1)
#define ls (x<<1)
#define rs (x<<1|1)int a[N],id[N],len;il int top(){ return a[1]; }il void push(RG int u){if(!id[u]) id[u]=++len,a[len]=u; RG int x=id[u];while(fa){if(dis[a[x]]>=dis[a[fa]]) break;swap(a[x],a[fa]),id[a[x]]=x,id[a[fa]]=fa,x=fa;}return;}il void pop(){id[a[1]]=0,a[1]=a[len--]; if (len) id[a[1]]=1; RG int x=1,son;while(ls<=len){son=(rs<=len && dis[a[rs]]<dis[a[ls]]) ? rs : ls;if(dis[a[x]]<=dis[a[son]]) break;swap(a[x],a[son]),id[a[x]]=x,id[a[son]]=son,x=son;}return;}#undef fa
#undef ls
#undef rs
}que;il void init(){c=gi(),n=gi();for(RG int i=1;i<=n;i++){x[i]=gi(),y[i]=gi(); int w=gi();H[i]=abs(x[i])+abs(y[i]);t[i]=t[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);S[i]=S[i-1]+w;}
}il void work(){ while(que.len) que.pop(); que.push(0);for(RG int i=1;i<=n;i++){int x=que.top();while(que.len&&S[i]-S[x]>c) que.pop(),x=que.top();f[i]=dis[x]+t[i]+H[i];dis[i]=f[i]-t[i+1]+H[i+1]; que.push(i);}printf("%d\n",f[n]); if(T)puts("");
}int main(){ T=gi(); while(T--){ init(); work(); } return 0; }

转载于:https://www.cnblogs.com/Hero-of-someone/p/7660442.html

[UVALive 3983] Robotruck相关推荐

  1. DP UVALive 6506 Padovan Sequence

    题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...

  2. The UVALIVE 7716 二维区间第k小

    The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...

  3. UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

    UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...

  4. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  5. 逆序数 UVALive 6508 Permutation Graphs

    题目传送门 1 /* 2 题意:给了两行的数字,相同的数字连线,问中间交点的个数 3 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 4 用归并排序或线段树求 ...

  6. Infinite Fraction Path UVALive - 8207

    Infinite Fraction Path UVALive - 8207 题意: 给你n个数,每个数在0到9之间,每个数的下标一次是0~n-1,然后他所能走到的数为(i^2+1)%n,i为他本身的下 ...

  7. F - Heron and His Triangle UVALive - 8206

    F - Heron and His Triangle UVALive - 8206 题意: 给你应该n,然后求一个最小的t,问长度为t-1,t,t+1所组成的三角形的面积为整数,t>=n 题解: ...

  8. Tree UVALive - 8212

    Tree UVALive - 8212 题意: 有n个点,k个颜色,每个点都要被染色,相同颜色之间的边算是被该颜色覆盖,问有多少边被所有颜色覆盖 题解: 题目给的是无根树,我们可以将1默认为根然后求所 ...

  9. Rabbits UVALive - 8211

    Rabbits UVALive - 8211 题意: n个兔子的位置,兔子每次可以跳到两个兔子之间,问最多可以跳多少下? 题解: 求出所有相邻两数的间隔,然后减去最小间隔就是答案 代码: #inclu ...

最新文章

  1. 单片机如何使用?51单片机C语言编程实例有哪些?
  2. Xamarin Essentials教程数据处理传输数据
  3. Spring 使用注解@DependsOn控制Bean加载顺序
  4. php artisan快捷命令
  5. 【数据结构与算法】共享栈的Java实现
  6. LVQ,Learning Vector Quantization,学习向量量化
  7. MiniGUI编程--静态框[转]
  8. 学习笔记——作业的知识点与注意事项
  9. 从开发者到讲师的心路历程与必知必会 | 原力计划
  10. iOS 操作系统被曝无线网络命名bug 导致 iPhone无法连接无线网络
  11. 八、JVM视角浅理解并发和锁
  12. 区块链教程Fabric1.0源代码分析putils(protos/utils工具包)
  13. 如何弄ad装配图_AD打印装配图的细节
  14. MATLAB中的resample函数根本理解,我专栏中有Guitar.MAT资源
  15. 如何使用 IT 服务台调查来提高满意度
  16. java protobuffer序列化_Java数据通讯中使用Googgle Protobuf 序列化与反序列化
  17. LibreCAD Windows编译问题集
  18. 无线Mesh网络简介
  19. 苏嵌学习日志03 07.13
  20. 优秀的产品经理都在读什么?

热门文章

  1. 三维点云学习(2)上- 二叉树实现K-NN Radius-NN Search
  2. LeetCode-185 : sql分组排序再取前几位
  3. Oauth2与授权管理
  4. C语言编程一个人活了多少天,来用代码算一算在这个世界上活了多少天吧
  5. 状态码302_HTTP状态码 201,202,302,405 ... 傻傻分不清,看这一个项目就够啦
  6. Windows开机自动启动Virtual Box虚拟机(官方指南手册)
  7. mysql——数据库事务(C#代码)
  8. 云服务器里可以放多少网站,一台云服务器上可以放多少个网站
  9. flex blazeds java spring_Flex+Java+Spring+BlazeDS 配置篇说明
  10. Qtcreator配置Ros环境