CODEVS 1258 关路灯
写动归终于能不看题解一次A了!(其实交了两次,一次80一次A)
我练功发自真心!
多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。
多瑞卡每晚到早晨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 Input4
3
2 2
5 8
6 1
8 7
样例输出 Sample Output56
区间动规,然而我并没有用到区间长度?
每次的行动都是扩展已经关掉的区间,直至关掉灯的区间覆盖整个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 -s[j]+s[i-1])); f1[i][j]=min(f1[i][j],f2[i][j]+len*(s -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 -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 -s[j])+s[k])); } } return 1; } int main(){ int v; scanf("%d\n%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] ,f2[1] ); printf("%d",ans); //print return 0; }
“为什么不肯花钱装个总闸”
- CODEVS 1258 关路灯
- 《Nodejs开发加密货币》之十四:Js处理数据计算的缺陷和解决方案
- 关于Makefile.am中与Build相关的变量设置 AM_CPPFLAGS
- C++ STL实例(一)
- ng-repeat orderby:notarray
- Node.js 函数
- VIJOS 1985 小h的妹子树一
- Java:interrupt()、interrupted()、isInterrupted()
- 2016/5/18
- POJ 1469 COURSES
- POJ 1469 COURSES
- bzoj3209 花神的数学题
- mac homebrew 安装
- 借助node实战WebSocket
- Azure File文件共享(6):使用Python开发
- Java网络编程基础(一)
- hive_CONCAT_WS合并的用法
- Bestcoder round#31 解题报告
- keepalived高可用lvs集群,主/备和主/主模型
- 【Java Learning】泛型类ArrayList 的用法介绍