zoukankan      html  css  js  c++  java
  • nyoj304 节能

    节能

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:5
    描述

    Dr.Kong设计的机器人卡多越来越聪明。最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧上所有的路灯。

    卡多每到早晨5:00准会在ZK大道上某盏路灯的旁边,然后他开始关灯。每盏灯都有一定的功率,机器人卡多有着自觉的节能意识,它希望在关灯期间,ZK大道右侧上所有路灯的耗电量总数是最少的。

    机器人卡多以1m/s的速度行走。假设关灯动作不需要花费额外的时间,因为当它通过某盏路灯时就顺手将灯关掉。

    请你编写程序,计算在给定路灯设置,灯泡功率以及机器人卡多的起始位置的情况下,卡多关灯期间,ZK大道上所有灯耗费的最小能量。

    输入
    有多组测试数据,以EOF为输入结束的标志
    每组测试数据第一行: N 表示ZK大道右侧路灯的数量 (2≤ N ≤ 1000)
    第二行: V 表示机器人卡多开始关灯的路灯号码。 (1≤V≤N)
    接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数

    D表示该路灯与ZK大道起点的距离 (用米为单位来表示),
    W表示灯泡的功率,即每秒该灯泡所消耗的能量数。路灯是按顺序给定的。
    ( 0≤D≤1000, 0≤W≤1000 )
    输出
    输出一个整数,即消耗能量之和的最小值。注意结果小于200,000,000
    样例输入
    4 
    3
    2 2
    5 8
    6 1
    8 7
    样例输出
    56
    来源
    第四届河南省程序设计大赛

    解题思路:

    本题是一道Dynamic Programming的题目,机器人关灯要么是去左边关灯,或者是去右边关灯,也即要关闭的下一个路灯要么是从已关闭路段的左端过去的,要么是从已关闭的路段的右端过去的,定义:

    DP[i][j][0]表示i到j的路灯都已经关闭,机器人在路灯i的位置,此时已经消耗的最小电能

    DP[i][j][1]表示i到j的路灯都已经关闭,机器人在路灯j的位置,此时已经消耗的最小电能

    则状态转移式:

    DP[i][j][0] = min(DP[i+1][j][0]+[i+1,j]路段以外未关闭路灯在机器人从i+1走的i期间消耗的电能,DP[i+1][j][1]+[i+1,j]路段以外未关闭路灯在机器人从j走到i期间消耗的电能)

    DP[i][j][1] = min(DP[i][j-1][0]+[i,j-1]路段以外未关闭路灯在机器人从i走到j期间消耗的电能,DP[i][j-1][1]+[i,j-1]路段以外未关闭路灯在机器人从j-1走到j期间消耗的电能)


    AC代码:

     1 #include<algorithm>
     2 #include<cstdio>
     3 #include<iostream>
     4 #include<cstring>
     5 using namespace std;
     6 const int N = 1010;
     7 int dp[N][N][2],dw[N][N],st[N],co[N];
     8 int main()
     9 {
    10     int n,s,v,sum;
    11     while(scanf("%d",&n)!=EOF)
    12     {
    13         memset(dw,0,sizeof(dw));
    14         sum = 0;
    15         scanf("%d",&v);
    16         for(int i =1; i<=n; i++)
    17         {
    18             scanf("%d %d",&st[i],&co[i]);
    19             sum =sum+co[i];
    20         }
    21         for(int i=1;i<=n;i++)
    22             for(int j=i;j<=n;j++)
    23               dw[i][j] = dw[i][j-1]+co[j];
    24         for(int i = v-1; i>0; i--)
    25         {
    26             dp[i][v][0] = dp[i+1][v][0]+(sum-dw[i+1][v])*(st[i+1]-st[i]);
    27             dp[i][v][1] = dp[i][v][0] +(sum-dw[i][v])*(st[v]-st[i]);
    28         }
    29         for(int j =v+1; j<=n; j++)
    30         {
    31             dp[v][j][1] =dp[v][j-1][1]+(sum-dw[v][j-1])*(st[j]-st[j-1]);
    32             dp[v][j][0] =dp[v][j][1]+(sum-dw[v][j])*(st[j]-st[v]);
    33         }
    34 
    35         for(int i =v-1;i>0;i--)
    36         {
    37             for(int j =v+1; j<=n; j++)
    38             {
    39                 dp[i][j][0] = min(dp[i+1][j][0]+(sum-dw[i+1][j])*(st[i+1]-st[i]),
    40                                   dp[i+1][j][1]+(sum-dw[i+1][j])*(st[j]-st[i]));
    41                 dp[i][j][1] = min(dp[i][j-1][0]+(sum-dw[i][j-1])*(st[j]-st[i]),
    42                                   dp[i][j-1][1]+(sum-dw[i][j-1])*(st[j]-st[j-1]));
    43             }
    44         }
    45 
    46         printf("%d
    ", min(dp[1][n][0], dp[1][n][1]));
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/lovychen/p/4429605.html
Copyright © 2011-2022 走看看