zoukankan      html  css  js  c++  java
  • CODEVS 1258 关路灯

    写动归终于能不看题解一次A了!(其实交了两次,一次80一次A)

    我练功发自真心!


    题目描述 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


    区间动规,然而我并没有用到区间长度?

    每次的行动都是扩展已经关掉的区间,直至关掉灯的区间覆盖整个1-n路灯区间

    在区间内,人要么停在左端点,要么停在右端点,而停在区间中间是浪费时间的行为

    两种状态分开处理

    f1(人在左边)[左区间][右区间]=最小耗电量

    f2(人在右边)[左区间][右区间]=最小耗电量

    当人在一个区间的右端点,要向右扩展一单位区间时,代价是dis[右端点][右端点+1]*未关的灯的功耗,向左同理


    //动规 
    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int f1[1100][1100];//人在区间左
    int f2[1100][1100];//人在区间右 
    int s[1100];
    int dis[1100];
    int w[1100];
    int n;
    int dp(int v){
    	int i,j;
    	int len=1;
    	for(i=v;i>=1;i--)
    	  for(j=v;j<=n;j++){
    	  	len=dis[j]-dis[i];
    	  	f2[i][j]=min(f2[i][j],f1[i][j]+len*(s[n]-s[j]+s[i-1]));
    	  	f1[i][j]=min(f1[i][j],f2[i][j]+len*(s[n]-s[j]+s[i-1]));
    	  	int k;
    	  	for(k=j+1;k<=n;k++){
    	  		f2[i][k]=min(f2[i][k],f2[i][k-1]+(dis[k]-dis[k-1])*((s[n]-s[k-1])+s[i-1]));
    		  }
    		for(k=i-1;k>=1;k--){
    			f1[k][j]=min(f1[k][j],f1[k+1][j]+(dis[k+1]-dis[k])*((s[n]-s[j])+s[k]));
    		  }
    	  }
    	return 1;
    }
    int main(){
    	int v;
    	scanf("%d
    %d",&n,&v);
    	int i,j;
    	for(i=1;i<=n;i++){
    		scanf("%d%d",&dis[i],&w[i]);
    		s[i]=s[i-1]+w[i];//总功率 
    	}
    	memset(f1,1111,sizeof(f1));//初始化 
    	memset(f2,1111,sizeof(f2));
    	for(int i=1;i<=n;i++)f1[i][i]=0,f2[i][i]=0;
    	dp(v);//以v为起始点开始动规 
    	int ans=min(f1[1][n],f2[1][n]);
    	printf("%d",ans);
    	//print
    	return 0;
    }


    “为什么不肯花钱装个总闸”


  • 相关阅读:
    SharePoint Workflow 定义文件示例
    XC#、Smart Client
    ASP.NET 2.0,无刷新页面新境界!
    ShadowFax Beta 1.0 is now AVAILABLE!
    SharePoint Data Provider
    《WalkThrough : SharePoint WebPart 入门指南 四》完成
    单元测试...
    Visual Studio 2005 Team System
    Return of Rich Client
    Implement Membership & Roles & Personalization in ASP.NET 1.1
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5550581.html
Copyright © 2011-2022 走看看