安慰MM
Description
在一个数轴上,有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的最小值.
Format
Input
输入文件的第一行包含一个整数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。
Output
输出只有一行:一个整数,即消耗rp之和的最小值。结果不超过1,000,000,000。
Samples
输入数据 1
input1
4
3
2 2
5 8
6 1
8 7
Copy
输出数据 1
output1
56
Copy
cpp
#include<bits/stdc++.h>
const int Max=1005;
using namespace std;
int f[Max][Max][2]={0},w[Max]={0},d[Max],n,v;
int main()
{
cin>>n>>v;
for(int i=1;i<=n;i++){
cin>>d[i]>>w[i];
w[i]+=w[i-1];
}
f[v][v][0]=f[v][v][1]=0;
for(int i=v-1;i>=1;i--){
f[i][v][0]=f[i+1][v][0]+(w[i]+(w[n]-w[v]))*(d[i+1]-d[i]);
f[i][v][1]=f[i][v][0]+(w[i-1]+(w[n]-w[v]))*(d[v]-d[i]);
}
for(int j=v+1;j<=n;j++){
f[v][j][1]=f[v][j-1][1]+(w[v-1]+(w[n]-w[j-1]))*(d[j]-d[j-1]);
f[v][j][0]=f[v][j][1]+(w[v-1]+(w[n]-w[j]))*(d[j]-d[v]);
}
for(int i=v-1;i>=1;i--){
for(int j=v+1;j<=n;j++){
f[i][j][0]=min(f[i+1][j][0]+(w[i]+(w[n]-w[j]))*(d[i+1]-d[i]),f[i+1][j][1]+(w[i]+(w[n]-w[j]))*(d[j]-d[i]));
f[i][j][1]=min(f[i][j-1][0]+(w[i-1]+(w[n]-w[j-1]))*(d[j]-d[i]),f[i][j-1][1]+(w[i-1]+(w[n]-w[j-1]))*(d[j]-d[j-1]));
}
}
cout<<min(f[1][n][0],f[1][n][1]);
return 0;
}