zoukankan      html  css  js  c++  java
  • [Noip模拟赛] Power

    POWER

    源程序名 POWER.??? (PAS,C,CPP)

    可执行文件名   POWER.EXE

    输入文件名     POWER.IN

    输出文件名     POWER.OUT

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

    多瑞卡每晚到早晨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。

     

    样例

    POWER.IN

    4

    3

    2 2

    5 8

    6 1

    8 7

    POWER.OUT

    56

    【题解】

    有点难,需要好好想想

    f[i,j]表示关闭[i,j]且停在i的min
    g[i,j]表示关闭[i,j]且停在j的min
    h[i,j]表示除了[i,j]其他功率

    那么就可以转移了

    f[i][j]=min(f[i+1][j]+h[i+1][j]*(d[i+1]-d[i]),g[i+1][j]+h[i+1][j]*(d[j]-d[i]));
    g[i][j]=min(f[i][j-1]+h[i][j-1]*(d[j]-d[i]),g[i][j-1]+h[i][j-1]*(d[j]-d[j-1]));

     1 #include <stdio.h>
     2 #include <string.h>
     3 using namespace std;
     4 long long f[1010][1010],g[1010][1010],h[1010][1010],d[1010],w[1010],p[1010];
     5 // f i,j表示关闭[i,j]且停在i的min
     6 // g i,j表示关闭[i,j]且停在j的min
     7 // h i,j表示除了[i,j]其他功率 
     8 int n,st; 
     9 inline void IO() {
    10     freopen("power.in","r",stdin);
    11     freopen("power.out","w",stdout);
    12 }
    13 inline int min(int a,int b) {return a<b?a:b;}
    14 inline void RS() {
    15     scanf("%d%d",&n,&st);
    16     for (int i=1;i<=n;++i) {
    17         scanf("%d%d",&d[i],&w[i]);
    18         p[i]=p[i-1]+w[i];    
    19     }
    20     for (int i=1;i<=n;++i)
    21         for (int j=i;j<=n;++j) 
    22              h[i][j]=p[n]+p[i-1]-p[j];
    23     for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) {
    24         f[i][j]=g[i][j]=2333333333333;
    25     }
    26     f[st][st]=g[st][st]=0;
    27     for (int j=st;j<=n;++j)
    28         for (int i=j-1;i>=1;--i) {
    29             f[i][j]=min(f[i+1][j]+h[i+1][j]*(d[i+1]-d[i]),g[i+1][j]+h[i+1][j]*(d[j]-d[i]));
    30             g[i][j]=min(f[i][j-1]+h[i][j-1]*(d[j]-d[i]),g[i][j-1]+h[i][j-1]*(d[j]-d[j-1]));
    31         }            
    32     printf("%lld
    ",min(f[1][n],g[1][n]));
    33 }
    34 int main() {
    35     IO(),
    36     RS();
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    Android&Handler2
    ACM&数字阶梯求和(大数问题)
    Android&MyThread
    【转】 《基于MFC的OpenGL编程》Part 15 Selection
    【转】 《基于MFC的OpenGL编程》Part 12 Creating and Using Display Lists
    【转】《基于MFC的OpenGL编程》Part 16 Reflection
    【转】 《基于MFC的OpenGL编程》Part 8 Colors
    【转】 《基于MFC的OpenGL编程》Part 14 Quadrics
    开发不同语言版本的C#程序
    基于ADS40的线阵摄影测量及数据处理
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/noip_power.html
Copyright © 2011-2022 走看看