首页 技术 正文
技术 2022年11月6日
0 收藏 838 点赞 618 浏览 1803 个字

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

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

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


首先设出状态,f[i][j],f[i][j]代表把第i盏灯到第j栈灯全部关闭的最小消耗。
但是问题出现了,我们发现对于一个区间[i,j],我们从i走到j的消耗和从j走到i的消耗是不一样的,所以我们新开一维,f[i][j][1]代表从左走到右边,f[i][j][0]代表从右走到左边。
对于f[i][j],我们只能从左边或者右边递推而来,也就是从f[i][j−1]或者f[i+1][j]推来

注:p[i][j]表示关掉i-j之间的所有灯后其余灯消耗的功率和;

#include <bits/stdc++.h>
#include <BITS/STDC++.H>using namespace std;typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 5e5 + ;
const int MAXM = 3e3 + ;inline int read() {
int x = , ff = ; char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') ff = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + (ch ^ );
ch = getchar();
}
return x * ff;
}inline void write(int x) {
if(x < ) putchar('-'), x = -x;
if(x > ) write(x / );
putchar(x % + '');
}int n, v, p[MAXN], sum[MAXM][MAXM], f[MAXM][MAXM][];
struct light {
int dis, w;
}d[MAXN];int main() {
n = read(); v = read();
for(int i = ; i <= n; ++i) {
d[i].dis = read();
d[i].w = read();
}
for(int i = ; i <= n; ++i)
p[i] = p[i - ] + d[i].w;
for(int i = ; i <= n; ++i)
for(int j = i; j <= n; ++j)
sum[i][j] = p[n] - (p[j] - p[i - ]);
memset(f, 0x3f, sizeof(f));
f[v][v][] = f[v][v][] = ;
for(int len = ; len <= n; ++len) {
for(int l = ; l <= n - len + ; ++l) {
int r = l + len - ;
f[l][r][] = min(f[l][r][], f[l + ][r][] + (d[l + ].dis - d[l].dis) * sum[l + ][r]);
f[l][r][] = min(f[l][r][], f[l + ][r][] + (d[r].dis - d[l].dis) * sum[l + ][r]);
f[l][r][] = min(f[l][r][], f[l][r - ][] + (d[r].dis - d[l].dis) * sum[l][r - ]);
f[l][r][] = min(f[l][r][], f[l][r - ][] + (d[r].dis - d[r - ].dis) * sum[l][r - ]);
}
}
write(min(f[][n][], f[][n][]));
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,091
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,568
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,416
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,188
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,825
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,908