zoj 3469 Food Delivery 区间dp + 提前计算费用

Time Limit: 2 Seconds      Memory Limit: 65536 KB


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 on an X-coordinate axis. The ith person‘s coordinate is Xi meters. And in the street there is a take-out restaurant which has coordinates X meters. One day at lunchtime, each person takes an order from the restaurant at the same time. As a worker in the restaurant, you need to start from the restaurant, send food to the N people, and then come back to the restaurant. Your speed is V-1 meters per minute.

You know that the N people have different personal characters; therefore they have different feeling on the time their food arrives. Their feelings are measured byDispleasure Index. At the beginning, the Displeasure Index for each person is 0. When waiting for the food, the ith person will gain Bi Displeasure Index per minute.

If one‘s Displeasure Index goes too high, he will not buy your food any more. So you need to keep the sum of all people‘s Displeasure Index as low as possible in order to maximize your income. Your task is to find the minimal sum of Displeasure Index.

Input

The input contains multiple test cases, separated with a blank line. Each case is started with three integers N ( 1 <= N <= 1000 ), V ( V > 0), X ( X >= 0 ), then N lines followed. Each line contains two integers Xi ( Xi >= 0 ), Bi ( Bi >= 0), which are described above.

You can safely assume that all numbers in the input and output will be less than 231 - 1.

Please process to the end-of-file.

Output

For each test case please output a single number, which is the minimal sum of Displeasure Index. One test case per line.

Sample Input

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

Sample Output

55



Author: LI, Cheng
Contest: ZOJ Monthly, February 2011

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define X first
#define Y second
using namespace std;

const int N = 1005;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> pii;

pii p[N];
int sum[N];

int dp[N][N][2];
int n, v, x;

int get(int i, int j, int f)
{
    if(i == j) return dp[i][j][f];
    int& res = dp[i][j][f];
    if(res != -1) return res;
    res = INF;
    if(!f) {
        int add = sum[n] - (sum[j] - sum[i]);
        res = min(res, get(i + 1, j, 0) + (p[i + 1].X - p[i].X) * add);
        res = min(res, get(i + 1, j, 1) + (p[j].X - p[i].X) * add);
    }
    else {
        int add = sum[n] - (sum[j - 1] - sum[i - 1]);
        res = min(res, get(i, j - 1, 1) + (p[j].X - p[j - 1].X) * add);
        res = min(res, get(i, j - 1, 0) + (p[j].X - p[i].X) * add);
    }
    return res;
}

int main()
{
    while(~scanf("%d%d%d", &n, &v, &x))
    {
        for(int i = 1; i <= n; ++i)  scanf("%d%d", &p[i].X, &p[i].Y);
        p[++n].X = x;
        p[n].Y = 0;
        sort(p + 1, p + n + 1);
        sum[0] = 0;
        for(int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + p[i].Y;

        int xpos;
        memset(dp, -1, sizeof dp);
        for(int i = 1; i <= n; ++i) if(p[i].X == x) { xpos = i; break; }
        for(int i = 1; i <= n; ++i) dp[i][i][0] = dp[i][i][1] = INF;
        dp[xpos][xpos][0] = dp[xpos][xpos][1] = 0;

        printf("%d\n", v * min(get(1, n, 0), get(1, n, 1)));
    }
    return 0;
}

  

时间: 2024-10-03 13:09:54

zoj 3469 Food Delivery 区间dp + 提前计算费用的相关文章

zoj 3469 Food Delivery(区间dp)

Food Delivery Time Limit: 2 Seconds      Memory Limit: 65536 KB 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 p

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 3469 Food Delivery (区间DP,经典)

题意: 在x轴上有一家外卖餐馆,有n个顾客站在x轴上不同坐标上且叫了外卖,每个人的脾气不同,每1分钟没有收到外卖就会增加Fi点愤怒值,而外卖小哥的车是有速度的v-1/分钟,问怎样的送餐次序会让所有顾客的愤怒值之和最小?输出愤怒值之和! 思路: 此题是很经典了,比较现实的模型. 随便画画就知道小哥可以一下子往左一下子往右走,往返多次也是有可能的,取决于顾客的愤怒系数Fi.那么在考虑一个区间[L,R]时,其任一子区间都必须是已经被考虑过了.现在考虑区间[L,R]可以转移到哪里,明显可以分别转移到[L

ZOJ - 3469 —— Food Delivery

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3469 dp[i][j][0] := 派送区间[i,j]的用户并且最后派送 i 时的最小值 dp[i][j][1] := 派送区间[i,j]的用户并且最后派送 j 时的最小值 dp[i][j][0] = min(dp[i+1][j][0]+cost1, dp[i+1][j][1]+cost2) dp[i][j][1] = min(dp[i][j-1][0]+cost3

ZOJ3469 Food Delivery[区间dp]

Food Delivery Time Limit: 2 Seconds      Memory Limit: 65536 KB 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 p

ZOJ 3537 Cake (区间DP,三角形剖分)

题意: 给出平面直角坐标系上的n个点的坐标,表示一个多边形蛋糕,先判断是否是凸多边形,若否,输出"I can't cut.".若是,则对这个蛋糕进行3角形剖分,切n-3次变成n-2份三角形蛋糕给小伙伴吃,但是每切一次需要一个费用,公式是:cost[i][j] = |xi + xj| * |yi + yj| % p 表示在两点i和j之间切一刀的费用.问最少费用是多少? 思路: 判断是否凸多边形需要用到求凸包的Andrew算法,时间复杂度为O(nlogn),然后判断凸包内的点数是否为n就行

ZOJ 3469 Food Delivery

 Food Delivery Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu 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 fo

ZOJ - 3537 Cake (凸包+区间DP+最优三角剖分)

Description 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 each cut is a line segment, whose two endpoin

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 i