1788 - POWER

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。

多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯。开始时,他站在某一盏路灯的旁边。

每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉。

多端卡因为太累了,所以只能以1m/s的速度行走。关灯不需要花费额外的时间,因为当他通过时就能将灯关掉。

编写程序,计算在给定路灯设置,灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。

题目输入

输入文件的第一行包含一个整数N2N1000,表示该村庄路灯的数量。

第二行包含一个整数V1VN,表示多瑞卡开始关灯的路灯号码。

接下来的N行中,每行包含两个用空格隔开的整数DW,用来描述每盏灯的参数,其中0D10000W1000D表示该路灯与村庄开始处的距离(用米为单位来表示)W表示灯泡的功率,即在每秒种该灯泡所消耗的能量数。路灯是按顺序给定的。

题目输出

输出文件的第一行即唯一的一行应包含一个整数,即消耗能量之和的最小值。注意结果小超过1,000,000,000

输入/输出样例

输入格式

4
3
2 2
5 8
6 1
8 7

输出格式

56

C++解答

#include <iostream>
#include <algorithm>
using namespace std;
const int N(1003),oo(0x7ffffff);
int f[N][N][2]={0},t[N]={0},w[N][N]={0};
int main()
{
    int n,v;
    cin>>n>>v;
    for(int i=1;i<=n;i++)
        cin>>t[i]>>w[i][i];
    for(int i=1;i<=n;i++)
        w[1][i]=w[1][i-1]+w[i][i];
    for(int i=n;i>=1;i--)
        w[i][n]=w[i+1][n]+w[i][i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            f[i][j][0]=f[i][j][1]=oo;
    f[v][v][0]=f[v][v][1]=0;
    for(int i=v;i>=1;i--)
        for(int j=v;j<=n;j++)
            if(i!=j)
            {
                f[i][j][0]=min(f[i+1][j][0]+(t[i+1]-t[i])*(w[1][i]+w[j+1][n]),
                               f[i+1][j][1]+(t[j]-t[i])*(w[1][i]+w[j+1][n]));
                f[i][j][1]=min(f[i][j-1][1]+(t[j]-t[j-1])*(w[1][i-1]+w[j][n]),
                               f[i][j-1][0]+(t[j]-t[i])*(w[1][i-1]+w[j][n]));
            }
    cout<<min(f[1][n][0],f[1][n][1])<<endl;
    return 0;
}