题目传送门

题目翻译:当我们专注于解决问题时,我们通常宁愿呆在电脑前而不是外出吃午饭。在这个时候,我们可能会要求提供食物。

假设有N个人生活在一条直线的街道上,它只是位于X坐标轴上。第i个人的坐标是Xi米。在街上有一个外围餐厅,坐标X米。在午餐时间的一天,每个人同时从餐厅接受订单。作为餐厅的工作人员,您需要从餐厅开始,向N人送食物,然后回到餐厅。你的速度是每分钟V-1米。

你知道N人有不同的个性;因此他们对食物到来的时间有不同的感觉。他们的感受是通过不满指数衡量的。一开始,每个人的不满指数为0.在等待食物时,第i个人将获得每分钟的双不满指数。

如果一个人的不满指数过高,他将不再购买你的食物了。因此,您需要尽可能降低所有人的不满指数之和,以便最大化您的收入。你的任务是找到不满指数的最小总和。

输入
输入包含多个测试用例,用空行分隔。每种情况以三个整数N(1 <= N <= 1000),V(V> 0),X(X> = 0)开始,然后是N行。每行包含两个整数Xi(Xi> = 0),Bi(Bi> = 0),如上所述。

您可以放心地假设输入和输出中的所有数字都小于2^31 - 1。

请处理到文件结尾。

产量
对于每个测试用例,请输出一个数字,这是不满指数的最小总和。每行一个测试用例。(来自谷歌翻译)

输入:

5 1 0
1 1
2 2
3 3
4 4
5 5

输出:

55

解题思路:首先按每个客人的坐标位置排序,此时定义某个状态dp【i】【j】为经过坐标轴上第i~j号位置产生的“不满”值,那么此时将产生一个问题:经过i~j,我们此时是在的i号位置还是第j号位置的呢?所以我们可以给这个状态加一维,此时dp【i】【j】【0】为经过i~j,此时在i号位置,dp【i】【j】【1】为经过i~j,此时在第j号位置。然后可以得到状态转移方程:

dp【i】【j】【0】=min(dp【i】【j】【0】,dp【i+1】【j】【0】+代价)(即此时我们从i+1号位置到达i号位置,代价为  时间*还没有经过的位置产生的“不满”值(即1~i号位置跟j+1~n号位置产生的“不满”值))

dp【i】【j】【0】=min(dp【i】【j】【0】,dp【i+1】【j】【1】+代价)(此时我们从第j号位置到达i号位置)

dp【i】【j】【1】=min(dp【i】【j】【1】,dp【i】【j-1】【1】+代价)(此时我们从第j-1号位置到达j号位置)

dp【i】【j】【1】=min(dp【i】【j】【1】,dp【i】【j-1】【0】+代价)(此时我们从第i号位置到达j号位置)

最后的答案就是经过1~n号位置所产生最小的“不满值”,即min(dp【1】【n】【0】,dp【1】【n】【1】);

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define ri register int
typedef long long ll; inline ll gcd(ll i,ll j){
return j==0?i:gcd(j,i%j);
}
inline ll lcm(ll i,ll j){
return i/gcd(i,j)*j;
}
inline void output(int x){
if(x==0){putchar(48);return;}
int len=0,dg[20];
while(x>0){dg[++len]=x%10;x/=10;}
for(int i=len;i>=1;i--)putchar(dg[i]+48);
}
inline void read(int &x){
char ch=x=0;
int f=1;
while(!isdigit(ch)){
ch=getchar();
if(ch=='-'){
f=-1;
}
}
while(isdigit(ch))
x=x*10+ch-'0',ch=getchar();
x=x*f;
}
const int maxn=1e3+5;
struct st{
int x,w;
bool operator < (const st tem)const{
return x<tem.x;
}
}stm[maxn];
int sum[maxn];
int dp[maxn][maxn][2];
int n,v,x;
int count(int l,int r){
if(l<=r)
return sum[r]-sum[l-1];
return 0;
}
void solve(){
memset(dp,0x3f,sizeof(dp));
int res;
for(int i=1;i<=n+1;i++){
if(stm[i].x==x){
res=i;//找到起点
break;
}
}
dp[res][res][0]=dp[res][res][1]=0;
for(int i=res;i>=1;i--){
for(int j=res;j<=n+1;j++){
int tem=count(1,i-1)+count(j+1,n+1);
if(i==j)
continue;
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(stm[i+1].x-stm[i].x)*(tem+stm[i].w));
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(stm[j].x-stm[i].x)*(tem+stm[i].w));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(stm[j].x-stm[i].x)*(tem+stm[j].w));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(stm[j].x-stm[j-1].x)*(tem+stm[j].w));
}
}
return ;
}
int main(){
while(scanf("%d%d%d",&n,&v,&x)!=EOF){
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++){
scanf("%d%d",&stm[i].x,&stm[i].w);
}
stm[n+1].x=x;
stm[n+1].w=0;
sort(stm+1,stm+n+2);
for(int i=1;i<=n+1;i++){
sum[i]=sum[i-1]+stm[i].w;
}
solve();
printf("%d\n",min(dp[1][n+1][0],dp[1][n+1][1])*v);
}
return 0;
}

  

Food Delivery ZOJ - 3469(区间dp)的更多相关文章

  1. zoj 3469 区间dp **

    题意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以V-1的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了 ...

  2. ZOJ 3469 区间DP Food Delivery

    题解 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm ...

  3. zoj 3537 区间dp+计算几何

    题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...

  4. ZOJ 3469 Food Delivery 区间DP

    这道题我不会,看了网上的题解才会的,涨了姿势,现阶段还是感觉区间DP比较难,主要是太弱...QAQ 思路中其实有贪心的意思,n个住户加一个商店,分布在一维直线上,应该是从商店开始,先向两边距离近的送, ...

  5. ZOJ 3469 Food Delivery(区间DP)

    https://vjudge.net/problem/ZOJ-3469 题意:在一条直线上有一个餐厅和n个订餐的人,每个人都有随时间上升的不满意值,从餐厅出发,计算出送完时最小的不满意值总和. 思路: ...

  6. ZOJ 3469Food Delivery(区间DP)

    Food Delivery Time Limit: 2 Seconds      Memory Limit: 65536 KB When we are focusing on solving prob ...

  7. ZOJ3469 Food Delivery —— 区间DP

    题目链接:https://vjudge.net/problem/ZOJ-3469 Food Delivery Time Limit: 2 Seconds      Memory Limit: 6553 ...

  8. [ZOJ]3541 Last Puzzle (区间DP)

    ZOJ 3541 题目大意:有n个按钮,第i个按钮在按下ti 时间后回自动弹起,每个开关的位置是di,问什么策略按开关可以使所有的开关同时处于按下状态 Description There is one ...

  9. ZOJ3469 Food Delivery 区间DP

    题意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以V-1的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了 ...

随机推荐

  1. nvidia驱动自动更新版本后问题解决 -- failed to initialize nvml: driver/library version mismatch

    因为必须关闭桌面窗口, 建议另外一台电脑ssh连接操作 1. 卸载旧版本并关闭图形界面 sudo apt-get remove --purge nvidia-\* sudo service light ...

  2. PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/php_mbstring.dll' 的解决方法

    step 1: cd /etc/php/{$yourphpversion}/cli step 2: sudo vim php.ini step 3: 在extension=php_mbstring.d ...

  3. Redis深入学习笔记(二)client list 命令详解

    Redis的client list 命令可以获取当前连接到redis server端的所有客户端以及相关状态,本篇主要介绍每一个参数的作用. clisnt list 命令输出结果如下: (1)标识:i ...

  4. ARM开发板挂载虚拟机 nfs目录

    ARM开发板做相关开发,为了调试方便,常把开发板mnt目录挂载到虚拟机nfs共享目录上,这样调试程序时候就不用把程序转到开发板上再运行,方便很多.要挂载nfs共享目录,需要安装必要的组件支持. 1.虚 ...

  5. 自动化接口测试(java)

    githup地址:https://github.com/SailFan/autoTestMock 包结构: common包 ExtentTestNGIReporterListener.java 为测试 ...

  6. On-die termination for DDR

    本文转载自: https://blog.csdn.net/weixin_38233274/article/details/81016870 ODT是什么鬼?为什么要用ODT?在很多关于DDR3的博文和 ...

  7. Postman runner参数化

    按照下面图片的顺序操作吧~ lets go 1.把要做参数化的字段的value用花括号标识起来,如:{{phone}} 2.准备一个csv的文件,把每次请求接口的参数按下图填写好,第一行写字段名称(p ...

  8. linux下导入、导出mysql数据库命令的实现方法

    首先建空数据库 mysql>create database abc; 导入数据库 mysql>use abc; 设置数据库编码 mysql>set names utf8; 导入数据( ...

  9. mysql 动态行转列

    表结果:create table user( id int , username ), create_time datetime, type int ) insert into user (`id`, ...

  10. python 运用numpy库与matplotlib库绘制数据图

    代码一 import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,6,100) y=np.cos(2*np.pi*x)*np ...