题意:

  在x轴上有一家外卖餐馆,有n个顾客站在x轴上不同坐标上且叫了外卖,每个人的脾气不同,每1分钟没有收到外卖就会增加Fi点愤怒值,而外卖小哥的车是有速度的v-1/分钟,问怎样的送餐次序会让所有顾客的愤怒值之和最小?输出愤怒值之和!

思路:

  此题是很经典了,比较现实的模型。

  随便画画就知道小哥可以一下子往左一下子往右走,往返多次也是有可能的,取决于顾客的愤怒系数Fi。那么在考虑一个区间[L,R]时,其任一子区间都必须是已经被考虑过了。现在考虑区间[L,R]可以转移到哪里,明显可以分别转移到[L-1,R]和[L,R+1],也就是往区间外送去1个人的外卖。由于送完区间[L,R]所有外卖后可能停在左/右边,得到的DP值不同,所以可以增加1维来区分送完后停的位置,设为dp[L][R][0/1]来记录愤怒之和。

  这样还没有完,如果仅考虑当前区间[L,R]的顾客的愤怒值之和的话,无论怎样记录还是难以实现转移(这也是比较巧的地方)。但是如果你将其他未送达的顾客的愤怒值也先算进dp值的话就好转移了,比如区间[L,R]转移到[L,R+1],那么[1,L-1]和[R+2,n]这些顾客就还在等外卖,每过1分钟他们的愤怒值也在增加,可以加到[L,R+1]的dp值进行考虑。

  有没有可能dp[L][R][0]会转移到dp[L][R+1][0]?也就是从L走到R+1后还回到L处。经过推算,并不需要这样,不是很难想的。

 //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const double PI = acos(-1.0);
const int N=;
struct node
{
int x, f;
}p[N];
int dp[N][N][], sum[N];
int n, V, x, pos;
inline int cmp(node a,node b){return a.x<b.x;} void init(int pos)
{
sum[]=;
for(int i=; i<=n; i++) sum[i]=sum[i-]+p[i].f; for(int i=; i<=n; i++) //初始化
for(int j=i; j<=n; j++)
dp[i][j][]=dp[i][j][]=INF;
dp[pos][pos][]=dp[pos][pos][]=;
} int cal(int pos)
{
for(int j=pos; j<=n; j++)
{
for(int i=pos; i>; i--)
{
int f=sum[i-]+sum[n]-sum[j]; //f值之和*
int L=dp[i][j][], R=dp[i][j][]; dp[i-][j][]=min(dp[i-][j][], L+f*(p[i].x-p[i-].x)); //往左
dp[i-][j][]=min(dp[i-][j][], R+f*(p[j].x-p[i-].x)); dp[i][j+][]=min(dp[i][j+][], L+f*(p[j+].x-p[i].x)); //往右
dp[i][j+][]=min(dp[i][j+][], R+f*(p[j+].x-p[j].x));
}
}
return min(dp[][n][], dp[][n][])*V;
} int main()
{
//freopen("input.txt", "r", stdin);
while(~scanf("%d%d%d",&n,&V,&x))
{
for(int i=; i<=n; i++)
scanf("%d%d", &p[i].x, &p[i].f); p[++n].x=x, p[n].f=; //添加餐馆
sort(p+, p+n+, cmp); for(int i=; i<=n; i++)
{
if(p[i].x==x) //找到餐馆
{
init(i);
cout<<cal(i)<<endl;
break;
}
}
}
return ;
}

AC代码

最新文章

  1. 微信小程序demo2
  2. Git ~ 管理修改 ~ Gitasd
  3. MySQL中char(36)被认为是GUID导致的BUG及解决方案
  4. Java使用JSP Tag Files &amp; JSP EL Functions打造你自己的页面模板
  5. bzoj 2327 构图暴力判断+独立集个数
  6. TUXEDO错误解决方案
  7. 关于SQL中的Update语句
  8. 忘记mysql 5.7的密码
  9. C#项目开发实践前言
  10. [原创]Nexus5 内核编译烧录过程记录
  11. MySQL优化 - 索引优化
  12. JQuery官方学习资料(译):$ vs $()
  13. JS怎样实现图片的懒加载以及jquery.lazyload.js的使用
  14. 【搬运】C指针 一
  15. nodejs中req.body对请求参数的解析问题
  16. E - Down or Right Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
  17. 网络下载功能实现(downloader ) ---- HTML5+
  18. MAPE 平均绝对百分误差
  19. 文本情感分类:分词 OR 不分词(3)
  20. normal 普通身份 sysdba 系统管理员身份 sysoper 系统操作员身份 dba和sysdba

热门文章

  1. Windows下怎样安装Tomcat
  2. 多进程小例子--fork+pipe
  3. 散列表(Hash table)及其构造
  4. 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows
  5. Vue实现选项卡效果
  6. 省选准备 MISTAKE 大全
  7. css圆角不圆和1px方案
  8. Linux —— GDB调试程序
  9. Consul实现服务治理1
  10. NET Core应用可以同时运行在Windows Container和Linux Container-1