• NOIP前夕:codevs,关路灯


    题目描述 Description

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

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

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

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

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

    输入描述 Input Description

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

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

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

    输出描述 Output Description

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

    样例输入 Sample Input

    4

    3

    2 2

    5 8

    6 1

    8 7

    样例输出 Sample Output

    56

    f[i,j,1]表示ij范围内的点都经过,最终停到j

    f[i,j,0]~~~~~~~~~~~~~~~~~~~~i

    f[i,j,0]=min{

               f[i+1,j,0]+(init[i+1]-init[i])*leave[i-1,j]

               f[i+1,j,1]+(init[j]-init[i])*leave[i-1,j]

                }

    f[i,j,1]=min{

               f[i,j-1,0]+(init[j]-init[i])*leave[i,j-1]

               f[i,j-1,1]+(init[j]-init[j-1])*leave[i,j-1]

               }

    预处理比较麻烦 f[v,v,0]=f[v,v,1]=1

                        f[i,v,1]=maxint*5000

                         f[v,i,0]=maxint*5000

    code:

    type rec=record
             x,y:longint;
             end;
    
    var n:Longint;
        edge:array[1..4000000]of rec;
        i,j,k:longint;
        max,xmax,a,b:array[1..2000000]of longint;
        init:array[1..4000000]of longint;
        mm,sum:longint;
        num:longint;
        x,y:longint;
    
    begin readln(n);
          for i:=1 to n-1 do
              begin readln(x,y);
                    inc(num);
                    edge[num].x:=x;
                    edge[num].y:=y;
                    inc(num);
                    edge[num].x:=y;
                    edge[num].y:=x;
              end;
          for i:=1 to n do
              read(init[i]);
          for i:=1 to num do
              begin k:=edge[i].x;
                    if init[edge[i].y]>max[k]
                       then begin xmax[k]:=max[k];
                                  max[k]:=init[edge[i].y];
                            end
                       else begin if init[edge[i].y]>xmax[k]
                                     then xmax[k]:=init[edge[i].y];
                            end;
                    b[k]:=(b[k]+init[edge[i].y]*init[edge[i].y]) mod 10007;
                    a[k]:=a[k]+init[edge[i].y];
              end;
          mm:=0;
          sum:=0;
          for i:=1 to n do
              begin if max[i]*xmax[i]>mm
                       then mm:=max[i]*xmax[i];
                    a[i]:=a[i] mod 10007;
                    sum:=(sum+a[i]*a[i]-b[i]) mod 10007;
              end;
          writeln(mm,' ',sum);
    end.
  • 相关阅读:
    BCP导出导入
    JBehave
    JavaWeb框架的基石
    SWI-Prolog
    面向对象设计三大特性
    android app启动过程(转)
    人,技术与流程(转)
    打破定式,突破屏障,走出自己的创意舒适区(转)
    野生程序员是指仅凭对计算机开发的兴趣进入这个行业,从前端到后台一手包揽,但各方面能力都不精通的人(转)
    Spring MVC异常处理详解 ExceptionHandler good
  • 原文地址:https://www.cnblogs.com/spiderKK/p/4928545.html
Copyright © 2020-2023  润新知