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的最小值.
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[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; }