背景
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。
第二行包含一个整数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
输入
4
3
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[][],rf[][],sumw[];
MM mm[];
bool cmp(MM a,MM b){
return a.d < b.d;
}
int main(){
cin>>n>>v;
for(int i = ;i <= n;i++){
scanf("%d%d",&mm[i].d,&mm[i].w);
}
sort(mm+,mm++n,cmp);
for(int i = ;i <= n;i++){
for(int j = ;j <= n;j++){
lf[i][j] = rf[i][j] = ;
}
}
for(int i = ;i <= n;i++) sumw[i] = sumw[i-] + mm[i].w;
lf[v][v] = rf[v][v] = ;
for(int l = ;l <= n - ;l++){
for(int i = max(v - l,);i <= v;i++){
int j = i + l;
if(j > n) continue;
lf[i][j] = min(lf[i+][j] + (mm[i+].d - mm[i].d) * (sumw[i] + sumw[n] - sumw[j]),rf[i+][j] + (mm[j].d - mm[i].d) * (sumw[i] + sumw[n] - sumw[j]));
rf[i][j] = min(rf[i][j-] + (mm[j].d - mm[j-].d) * (sumw[i-] + sumw[n] - sumw[j-]),lf[i][j-] + (mm[j].d - mm[i].d) *(sumw[i-] + sumw[n] - sumw[j-]));
}
}
cout<<(lf[][n] < rf[][n] ? lf[][n] : rf[][n]);
return ;
}