Food Delivery ZOJ - 3469 (区间dp)

Food Delivery

ZOJ - 3469

题意:快递员送外卖,n个客户,起始位置为x,速度为v,每个客户单位时间不满意度增加hi,问最少增加多少不满意度。

每一个客户可能是从左侧送到或者从右侧送到。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define CLR(m,a) memset(m,a,sizeof(m))
 4 const int maxn=1010;
 5 const int inf=0x3f3f3f3f;
 6 int dp[maxn][maxn][2];
 7 int sum[maxn];
 8 struct Node{
 9     int x,h;
10     bool operator <(const Node &a)const {
11         return x<a.x;
12     }
13 }node[maxn];
14
15 int main(){
16     int n,v,x;
17     while(scanf("%d%d%d",&n,&v,&x)!=EOF){
18         CLR(dp,inf);
19         CLR(sum,0);
20         node[0].x=x;
21         node[0].h=0;
22         for(int i=1;i<=n;i++){
23             scanf("%d%d",&node[i].x,&node[i].h);
24         }
25         sort(node,node+n+1);
26         sum[0]=node[0].h;
27         for(int i=1;i<=n;i++) sum[i]=sum[i-1]+node[i].h;
28         int k;
29         for(int i=0;i<=n;i++){
30             if(node[i].x==x){
31                 dp[i][i][0]=dp[i][i][1]=0;
32                 k=i;
33                 break;
34             }
35         }
36         for(int i=k;i>=0;i--){
37             for(int j=k;j<=n;j++){
38                 if(i==j) continue;
39                 dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(sum[n]-(sum[j]-sum[i]))*(node[i+1].x-node[i].x));
40                 dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(sum[n]-(sum[j]-sum[i]))*(node[j].x-node[i].x));
41                 dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(sum[n]-(sum[j-1]-sum[i-1]))*(node[j].x-node[i].x));
42                 dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(sum[n]-(sum[j-1]-sum[i-1]))*(node[j].x-node[j-1].x));
43             }
44         }
45         printf("%d\n",min(dp[0][n][0],dp[0][n][1])*v);
46     }
47 }

时间: 2024-11-19 16:48:44

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

zoj 3469 区间dp

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4255 这特喵的不就是河南省某届省赛那道开关灯的强化版题目吗.... 一是数据增强了可能爆int,所以用的LL才A,还有就是给出的坐标不一定有序注意排序,还有起点不一定是送餐点,要把起点也看做是一个点一共N+1个点. dp[i][j][k]表示送完[i,j]之间的餐且此时处于左/右端点所消耗的价值,答案就是min(dp[1][N+1][0],dp[1][N+1][1]) 1 #

ZOJ3469 Food Delivery (经典区间dp)

本题和某一年的oi题非常相似,都是经典套路 我们知道我们在送完食物后既可以向前送也可以回头送,这就体现了区间dp的思想 为什么我们这次的区间dp不用枚举第三维k来枚举从哪里送过来呢? 因为送货员不是傻子,他如果送到你这了,那么在你们两之间的可以都顺路送了,所以我们只需要枚举两个位置就行 这题的输入不一定递增,所以建议输入完后排序 #include<iostream> #include<cstdio> #include<cstring> #include<algor

Food Delivery ZOJ - 3469(区间dp)

题目传送门 题目翻译:当我们专注于解决问题时,我们通常宁愿呆在电脑前而不是外出吃午饭.在这个时候,我们可能会要求提供食物. 假设有N个人生活在一条直线的街道上,它只是位于X坐标轴上.第i个人的坐标是Xi米.在街上有一个外围餐厅,坐标X米.在午餐时间的一天,每个人同时从餐厅接受订单.作为餐厅的工作人员,您需要从餐厅开始,向N人送食物,然后回到餐厅.你的速度是每分钟V-1米. 你知道N人有不同的个性;因此他们对食物到来的时间有不同的感觉.他们的感受是通过不满指数衡量的.一开始,每个人的不满指数为0.

ZOJ 3469 Food Delivery(区间DP)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4255 题意:n个人订餐.n个人位于一条线上,饭店也在这条线上.每个人有一个脾气值p.若第i分钟得到他预定的饭不满意度为p*i.送饭人的速度已知.求一种送饭顺序使得总不满意度最小. 思路:设f[i][j][0],f[i] [j][1]分别表示将[i,j]区间的送完,最后停在左边或右边的最小不满意度.那么我们在DPf[i][j][0]时可以从f[i+1][j]进行转 移

zoj 3537 Cake (凸包判定+区间dp)

Cake Time Limit: 1 Second      Memory Limit: 32768 KB You want to hold a party. Here's a polygon-shaped cake on the table. You'd like to cut the cake into several triangle-shaped parts for the invited comers. You have a knife to cut. The trace of eac

Food Delivery zoj3469 区间dp

Description When we are focusing on solving problems, we usually prefer to stay in front of computers rather than go out for lunch. At this time, we may call for food delivery. Suppose there are N people living in a straight street that is just lies

ZOJ 3537 Cake 求凸包 区间DP

题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价是多少. 思路:首先判断多边形是否是凸多边形,之后就是区间dp了. 求出凸包后,按逆时针来看. 设置dp[i][j]为从顶点i到顶点j所围成凸多边形的最优解. 枚举切点k (i < k < j) dp[i][j] = min(dp[i][k] + dp[k][j] + cost[i][k] + c

ZOJ 3892 Available Computation Sequence 区间dp

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5595 题意:给出n个字符串,里面包含'*', '.', '^', '!'这四个运算符,以及小写字母(表示向量)和数字. 四个运算符都有不同的运算规则.问添上括号后,可以组成多少个不同的算式(不能进行非法运算). 思路:简单区间DP,把一个运算符看成一位. dp[i][j][1]表示第i-j位运算结果为数字的情况有多少种. dp[i][j][0]表示第i-j位运算结果

ZOJ 3537 Cake(凸包+区间DP)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形(凸包)则不能切,直接输出"I can't cut."切多边形时每次只能在顶点和顶点间切,每切一次的花费为 cost(i, j) = |xi + xj| * |yi + yj| % p.问把多边形切成最多个不相交三角形的最小代价是多少. 解题思路:先求出凸包,接着可以用区间DP解决,设dp