zoukankan      html  css  js  c++  java
  • 【LSGDOJ 1351】关灯

    题目描述

    多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。
    多瑞卡每晚到早晨 5 点钟都在晚会上,然后他开始关灯。开始时,他站在某一盏路灯的旁边。
    每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉。
    多端卡因为太累了,所以只能以 1m/s 的速度行走。关灯不需要花费额外的时间,因为当他通过时就能将灯关掉。
    编写程序,计算在给定路灯设置,灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。

    输入

    输入文件的第一行包含一个整数 N,2≤N≤1000,表示该村庄路灯的数量。
    第二行包含一个整数 V,1≤V≤N,表示多瑞卡开始关灯的路灯号码。
    接下来的 N 行中,每行包含两个用空格隔开的整数 D 和 W,用来描述每盏灯的参数,其中 0≤D≤1000,0≤W≤1000。D
    表示该路灯与村庄开始处的距离(用米为单位来表示),W 表示灯泡的功率,即在每秒种该灯泡所消耗的能量数。路灯是按顺序给定的。

    输出

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

    样例输入

    4 3 2 2 5 8 6 1 8 7

    样例输出

    56
     
    题解:
    简单区间DP:F[i][j][0]表示关完i到j且人在左边的最小消耗 F[i][j][1]表示关完i到j且人在右边的最小消耗
    转移方程见代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 const int N=1005,INF=1000000005;
     7 int F[N][N][2];
     8 int gi(){
     9     int str=0;char ch=getchar();
    10     while(ch>'9' || ch<'0')ch=getchar();
    11     while(ch>='0' && ch<='9')str=str*10+ch-48,ch=getchar();
    12     return str;
    13 }
    14 void Clear(){
    15     for(int i=0;i<N;i++)for(int j=0;j<N;j++)F[i][j][0]=F[i][j][1]=INF;
    16 }
    17 int x[N],d[N],sum[N];
    18 int main()
    19 {
    20     int n=gi(),s=gi();
    21     Clear();
    22     for(int i=1;i<=n;i++)
    23     x[i]=gi(),d[i]=gi();
    24     for(int i=1;i<=n;i++)sum[i]=sum[i-1]+d[i];
    25     F[s][s][0]=F[s][s][1]=0;
    26     int to,tmp,lim;
    27     for(int k=1;k<n;k++)
    28     {
    29         lim=s-k>1?s-k:1;
    30         for(int i=s;i>=lim;i--)
    31         {
    32             to=i+k;
    33             tmp=F[i][to-1][0]+(sum[n]-sum[to-1]+sum[i-1])*(x[to]-x[i]);
    34             if(tmp<F[i][to][1])F[i][to][1]=tmp;
    35             
    36             tmp=F[i][to-1][1]+(sum[n]-sum[to-1]+sum[i-1])*(x[to]-x[to-1]);
    37             if(tmp<F[i][to][1])F[i][to][1]=tmp;
    38             
    39             tmp=F[i+1][to][0]+(sum[n]-sum[to]+sum[i])*(x[i+1]-x[i]);
    40             if(tmp<F[i][to][0])F[i][to][0]=tmp;
    41             
    42             tmp=F[i+1][to][1]+(sum[n]-sum[to]+sum[i])*(x[to]-x[i]);
    43             if(tmp<F[i][to][0])F[i][to][0]=tmp;
    44         }
    45     }
    46     printf("%d",min(F[1][n][0],F[1][n][1]));
    47     return 0;
    48 }
  • 相关阅读:
    HDU 2563 统计问题 (DFS + 打表)
    KendoUi中KendoDropDownList控件的使用——三级级联模块的实现
    POJ 1325 &amp;&amp; ZOJ 1364--Machine Schedule【二分图 &amp;&amp; 最小点覆盖数】
    crontab FAQ
    思科2960trunk vlan配置及路由IP配置
    hdoj-1593-find a way to escape【数学题】
    Java编程思想(四) —— 复用类
    在 Android 应用程序中使用 SQLite 数据库以及怎么用
    Swift Standard Library Reference.pdf
    VC、IE、ASP环境下打印、预备的完美解决方式
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7001496.html
Copyright © 2011-2022 走看看