tyvj1097 mm不哭

背景

Bless all rp++..

描述

在一个数轴上,有n个MM(绝非恐龙!)在哭泣(5555~一直哭).

tcboy也在这个数轴上,并恰好看到了这一幕,由于每个MM哭都会让tcboy损失一定的rp,于是tcboy有必要去安慰她们.(真命苦啊 T.T)

开始时,tcboy站在k号MM的旁边.

现在知道第i个MM哭泣每秒钟会使tcboy降低 w[i]的rp (单位rp/s).

而tcboy的行走速度很慢只有1m/s . 

tcboy安慰MM的方式很特别(怎么安慰随便大家YY了..#@$%^%$#@),不需要花费时间.

请计算tcboy安慰完所有MM,会消耗掉的rp的最小值.

输入格式

输入文件的第一行包含一个整数N,2<=N<=1000,表示MM的数量。
第二行包含一个整数V,1<=V<=N,表示开始时tcboy站在几号MM的旁边.
接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每个MM,其中0<=D<=1000,0<=W<=1000。D表示MM在数轴上的位置(单位: m),W表示每秒钟会使tcboy降低W的rp。

输出格式

输出只有一行:一个整数,即消耗rp之和的最小值。结果不超过1,000,000,000。

测试样例1

输入



2 2 
5 8 
6 1 
8 7

输出

56

备注

注意结果的大小。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
struct MM{
    int d;
    int w;
};
int n,v;
long long lf[1005][1005],rf[1005][1005],sumw[1005];
MM mm[1005];
bool cmp(MM a,MM b){
    return a.d < b.d;
}
int main(){
    cin>>n>>v;
    for(int i = 1;i <= n;i++){
        scanf("%d%d",&mm[i].d,&mm[i].w);
    }
    sort(mm+1,mm+1+n,cmp);
    for(int i = 0;i <= n;i++){
        for(int j = 0;j <= n;j++){
            lf[i][j] = rf[i][j] = 1087654321;
        }
    }
    for(int i = 1;i <= n;i++) sumw[i] = sumw[i-1] + mm[i].w;
    lf[v][v] = rf[v][v] = 0;
    for(int l = 1;l <= n - 1;l++){
        for(int i = max(v - l,1);i <= v;i++){
            int j = i + l;
            if(j > n) continue;
            lf[i][j] = min(lf[i+1][j] + (mm[i+1].d - mm[i].d) * (sumw[i] + sumw[n] - sumw[j]),rf[i+1][j] + (mm[j].d - mm[i].d) * (sumw[i] + sumw[n] - sumw[j]));
            rf[i][j] = min(rf[i][j-1] + (mm[j].d - mm[j-1].d) * (sumw[i-1] + sumw[n] - sumw[j-1]),lf[i][j-1] + (mm[j].d - mm[i].d) *(sumw[i-1] + sumw[n] - sumw[j-1]));
        }
    }
    cout<<(lf[1][n] < rf[1][n] ? lf[1][n] : rf[1][n]);
    return 0;
}

 

posted @ 2016-08-20 22:32  ACforever  阅读(303)  评论(0编辑  收藏  举报