列表

详情


NC15447. wyh的问题

描述

我国现在能源消耗非常严重,现在政府有这样一个工作,每天早上都需要把一些路灯关掉,但是他们想让在关闭的过程中所消耗的能源是最少的,负责路灯关闭的工作人员以1m/s的速度进行行走,假设关闭路灯的时候不需要花费任何的时间,请你编写一个程序,计算在给定路灯位置和每个路灯的消耗能源的多少,求出当所有路灯关闭的时候所需要的最少能量

输入描述

多组测试数据循环输入
每组测试数据第一行:N表示路灯的数量 (2<=N <=1000)
第二行:V表示开始关灯的路灯号码。 (1<=V<=N)
接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数
D表示该路灯到原点的距离 (用米为单位来表示),
W表示灯泡的功率,即每秒该灯泡所消耗的能量数。(0<=D<=1000,0<=W<=1000)
路灯按照顺序给出,起始位置的那盏灯不算消耗的电能里面

输出描述

输出一个整数,即消耗能量之和的最小值。

示例1

输入:

4
3
2 2
5 8
6 1
8 7

输出:

56

说明:

对于样例,我一开始在第三个路灯的位置,即在6位置
第1s的时候去5把第二盏灯关闭,消耗电能8
然后去第四盏灯,第四盏灯亮的时间是4s 所以消耗电能28
最后去关第一盏灯第一盏灯亮的时间是10s 所以消耗电能20
最后总和为8+28+20=56

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 166ms, 内存消耗: 8332K, 提交时间: 2023-04-29 09:29:34

#include<bits/stdc++.h>
using namespace std;
long long d[1005],w[1005],dp[1005][1005];
int main(){
    int n; 
    while(cin>>n){
    int v; cin>>v;
    for(int i=1;i<=n;i++){
        cin>>d[i]>>w[i];
        w[i]+=w[i-1];
    }
    
    memset(dp,0x3f,sizeof dp);
    dp[v][v]=0;
    for(int i=v;i>=1;i--){
        for(int j=v;j<=n;j++){
            dp[i][j]=min(dp[i][j],min(dp[j-1][i]+(d[j]-d[i])*(w[n]-w[j-1]+w[i-1]),dp[i][j-1]+(d[j]-d[j-1])*(w[n]-w[j-1]+w[i-1])));
            dp[j][i]=min(dp[j][i],min(dp[i+1][j]+(d[j]-d[i])*(w[n]-w[j]+w[i]),dp[j][i+1]+(d[i+1]-d[i])*(w[n]-w[j]+w[i])));
        }
    }
    cout<<min(dp[1][n],dp[n][1])<<endl;
    }
}

上一题