https://www.luogu.org/problem/P5017

参考:https://www.luogu.org/blog/ztyluogucpp/solution-p5017

我想我大概是废了。

肯定是要对$t$排序的。

最初想法肯定是$f[i]$表示前$i$个人全上车或到站的最小等待时间。

但你能够发现如果不给出上一班车的时间的话$f$根本转移不了。

那就$f[i][j]$表示最后一班车$j$时开出的最小等待时间?

数据范围打人脸,于是我就去查题解了。

但是我们发现实际上最后一班车开出的时间一定在$[t[i],t[i]+m)$之间,因为最差上一班车会在$t[i]-1$开出,$t[i]+m-1$回来,如果我们让车停在那里再开出显然会让乘客白等。

因此我们就可以改变$f[i][j]$为前$i$个人全上车或到站,最后一班车从$t[i]+j$时开出的最小等待时间。

状态转移方程可以很容易的写出:

$f[i][j]=min(f[i][j],f[k][l]+sum(k+1,i,t[i]+j))$(你得保证变量合法)

最终答案就是$min(f[n][0]\sim f[n][m-1])$

其中$sum(i,j,k)$函数表示第$i$人到第$j$人等时刻$k$发车的等待时间和,显然预处理前缀和就可以$O(1)$算了。

但是这个式子也是$O(n^2m^2)$过不了怎么办?

我们$j$的下限肯定是$max(t[k]+l+m-t[i],0)$的,但是真的有必要从这个下限枚举到$m-1$吗?

显然,到$i$上车时,比起让车等着,不如能早发就早发,所以虽然下限往上的状态$f$可能会错,但答案一定不会错。

因此没必要枚举$j$,复杂度$O(n^2m)$

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
const int M=;
const ll INF=1e18;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
ll t[N],s[N],f[N][M];
ll sum(int l,int r,ll now){
return now*(r-l+)-s[r]+s[l-];
}
int main(){
int n=read(),m=read();
for(int i=;i<=n;i++)t[i]=read();
sort(t+,t+n+);
for(int i=;i<=n;i++)s[i]=s[i-]+t[i];
for(int i=;i<=n;i++){
for(int j=;j<m;j++)f[i][j]=sum(,i,t[i]+j);
for(int j=;j<i;j++){
for(int k=;k<m;k++){
ll now=max(t[j]+k+m,t[i]);
f[i][now-t[i]]=min(f[i][now-t[i]],f[j][k]+sum(j+,i,now));
}
}
}
ll ans=INF;
for(int i=;i<m;i++)ans=min(ans,f[n][i]);
printf("%lld\n",ans);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

洛谷P5017:摆渡车——题解的更多相关文章

  1. NOIp2018普及组T3暨洛谷P5017 摆渡车:题解

    题目链接:https://www.luogu.org/problemnew/show/P5017 emm,这次的真的不简单的,T3比T4难? 醉了... 蒟蒻肯定没有其他大佬讲的好啊,但肯定尽力,真的 ...

  2. 洛谷P5017摆渡车

    题目 一道做法多种多样的题,DP做法的状态也很多. 我用\(dp[i]\)表示在第i秒发车的时间和,然后dp方程就很好写了 \(dp[i] = dp[j] + i车的等待时间\)j属于i-2m ~ i ...

  3. 洛谷 P5017 摆渡车

    题目传送门 解题思路: 个人感觉DP这东西,只可意会,不可言传 AC代码: #include<iostream> #include<cstdio> #include<cs ...

  4. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  5. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  6. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  7. [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)

    [POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...

  8. [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解

    原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...

  9. [洛谷P3948]数据结构 题解(差分)

    [洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...

  10. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

随机推荐

  1. ObjC: 委托模式

    转自:http://marshal.easymorse.com/tech/objc-%e5%a7%94%e6%89%98%e6%a8%a1%e5%bc%8f 在ObjC中,经常提到委托模式(deleg ...

  2. 【转载】Gradle学习 第八章:依赖管理基础

    转载地址:http://ask.android-studio.org/?/article/10 This chapter introduces some of the basics of depend ...

  3. c++指针全攻略

    1.指针概念理解 int*  p      定义一个指针(推荐使用这种写法int* ,理解上有好处)        p 指针变量:        *   间接运算符(访问符),代表访问该地址所指向的空 ...

  4. centos6升级gcc版本

    初始版本: 下面是CentOS6.6将gcc升级至4.8.2的过程: 安装仓库: #安装仓库 wget http://people.centos.org/tru/devtools-2/devtools ...

  5. JAVA concurrent包下Semaphore、CountDownLatch等用法

    CountDownLatch 跟join的区别 CountDownLatch用处跟join很像,但是CountDownLatch更加灵活,如果子线程有多个阶段a.b.c; 那么我们可以实现在a阶段完成 ...

  6. PHP获取当前服务器版本,Ip等详细信息

    1. 服务器IP地址 $_SERVER['SERVER_ADDR'] 服务器域名 $_SERVER['SERVER_NAME'] 服务器端口 $_SERVER['SERVER_PORT'] 服务器版本 ...

  7. libass简明教程

    [时间:2019-05] [状态:Open] [关键词:字幕,libass,字幕渲染,ffmpeg, subtitles, video filter] 0 引言 libass库则是一个轻量级的对ASS ...

  8. Python 模拟伯努利试验和二项分布

    1.模拟 27 次投掷硬币的伯努利试验 代码: from scipy import stats import numpy as np p = 0.5 # 生成冻结分布函数 bernoulliDist ...

  9. 洛谷P2634 [国家集训队]聪聪可可(点分治)

    传送门 题意: 给出一颗树,每条边都有一定的边权. 先问点之间路径和为\(3\)的倍数的点对有多少. 思路: 点分治模板题. 可以将问题转化为经过一个点\(t\)的路径和不经过点\(t\)的路径两种情 ...

  10. 用 tomcat 部署 Jenkins

    在tomcat 下面部署 Jenkins 版本 tomcat (7.0.94) +  jdk (7) + jenkins (2.46.3) 前两次没有部署成功,应该是 jdk 版本的问题, 如果不成功 ...