洛谷—— P1220 关路灯
https://www.luogu.org/problem/show?pid=1220
题目描述
某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。
为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关灯时也都是尽快地去关,但是老张不知道怎样去关灯才能够最节省电。他每天都是在天亮时首先关掉自己所处位置的路灯,然后可以向左也可以向右去关灯。开始他以为先算一下左边路灯的总功率再算一下右边路灯的总功率,然后选择先关掉功率大的一边,再回过头来关掉另一边的路灯,而事实并非如此,因为在关的过程中适当地调头有可能会更省一些。
现在已知老张走的速度为1m/s,每个路灯的位置(是一个整数,即距路线起点的距离,单位:m)、功率(W),老张关灯所用的时间很短而可以忽略不计。
请你为老张编一程序来安排关灯的顺序,使从老张开始关灯时刻算起所有灯消耗电最少(灯关掉后便不再消耗电了)。
输入输出格式
输入格式:
文件第一行是两个数字n(0<n<50,表示路灯的总数)和c(1<=c<=n老张所处位置的路灯号);
接下来n行,每行两个数据,表示第1盏到第n盏路灯的位置和功率。
输出格式:
一个数据,即最少的功耗(单位:J,1J=1W·s)。
输入输出样例
5 3
2 10
3 20
5 20
6 30
8 10
270
说明
输出解释:
{此时关灯顺序为3 4 2 1 5,不必输出这个关灯顺序}
搜索+剪枝
#include <cstdio> int n,c,totw,ans;
int pos[],w[]; inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
} bool vis[];
void DFS(int now_pos,int cnt,int sum,int now_w)
{
if(sum>ans) return ;
if(cnt==n)
{
ans=ans<sum?ans:sum;
return ;
}
int l=now_pos, r=now_pos;
for(; vis[l]&&<=l; ) l--;
for(; vis[r]&&r<=n; ) r++;
if(l>=)
{
vis[l]=;
DFS(l,cnt+,sum+now_w*(pos[now_pos]-pos[l]),now_w-w[l]);
vis[l]=;
}
if(r<=n)
{
vis[r]=;
DFS(r,cnt+,sum+now_w*(pos[r]-pos[now_pos]),now_w-w[r]);
vis[r]=;
} } int AC()
{
read(n),read(c);
for(int i=; i<=n; ++i)
read(pos[i]),read(w[i]),totw+=w[i];
vis[c]=; ans=0x3f3f3f3f;
DFS(c,,,totw-w[c]);
printf("%d\n",ans);
return ;
} int Hope=AC();
int main(){;}
AC
f[i][j][0]表示关完区间[i,j]在i,f[i][j][1]表示关完区间[i,j]后在j
处理出W的前缀和,
f[i][j][0]=min(f[i][j][0],f[i+1][j][0]+(pos[i+1]-pos[i])*(totw[n]-(totw[j]-totw[i])));
f[i][j][0]=min(f[i][j][0],f[i+1][j][1]+(pos[j]-pos[i])*(totw[n]-(totw[j]-totw[i])));
f[i][j][1]=min(f[i][j][1],f[i][j-1][0]+(pos[j]-pos[i])*(totw[n]-(totw[j-1]-totw[i-1])));
f[i][j][1]=min(f[i][j][1],f[i][j-1][1]+(pos[j]-pos[j-1])*(totw[n]-(totw[j-1]-totw[i-1])));
#include <cstring>
#include <cstdio> #define min(a,b) (a<b?a:b) int n,c,ans;
int f[][][];
int pos[],w[],totw[]; inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
} int AC()
{
read(n),read(c);
for(int i=; i<=n; ++i)
read(pos[i]),read(w[i]),
totw[i]=totw[i-]+w[i];
memset(f,,sizeof(f));
f[c][c][]=f[c][c][]=;
for(int i=c; i>=; --i)
for(int j=i+ ;j<=n; ++j)
{
f[i][j][]=min(f[i][j][],f[i+][j][]+(pos[i+]-pos[i])*(totw[n]-(totw[j]-totw[i])));
f[i][j][]=min(f[i][j][],f[i+][j][]+(pos[j]-pos[i])*(totw[n]-(totw[j]-totw[i])));
f[i][j][]=min(f[i][j][],f[i][j-][]+(pos[j]-pos[i])*(totw[n]-(totw[j-]-totw[i-])));
f[i][j][]=min(f[i][j][],f[i][j-][]+(pos[j]-pos[j-])*(totw[n]-(totw[j-]-totw[i-])));
}
printf("%d\n",min(f[][n][],f[][n][]));
return ;
} int Hope=AC();
int main(){;}
DP AC
洛谷—— P1220 关路灯的更多相关文章
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 洛谷P1220 关路灯
洛谷1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关 ...
- 洛谷——P1220 关路灯
P1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉 ...
- 洛谷P1220 关路灯(区间dp)
关路灯 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯.为了给村里节 ...
- 洛谷P1220 关路灯 题解 区间DP
题目链接:https://www.luogu.com.cn/problem/P1220 本题涉及算法:区间DP. 我们一开始要做一些初始化操作,令: \(p[i]\) 表示第i个路灯的位置: \(w[ ...
- 洛谷P1220关路灯[区间DP]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 洛谷P1220关路灯[区间DP 提前计算代价]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 洛谷P1220 关路灯【区间dp】
题目:https://www.luogu.org/problemnew/show/P1220 题意:给定n盏灯的位置和功率,初始时站在第c盏处. 关灯不需要时间,走的速度是1单位/秒.问把所有的灯关掉 ...
- 洛谷 P1220 关路灯 (贪心+区间dp)
这一道题我一直在想时间该怎么算. 看题解发现有个隐藏的贪心. 路径一定是左右扩展的,左右端点最多加+1(我竟然没发现!!) 这个性质非常重要!! 因此这道题用区间dp f[i][j]表示关完i到j的路 ...
随机推荐
- 根据图片url地址获取图片的宽高
/** * 根据img获取图片的宽高 * @param img 图片地址 * @return 图片的对象,对象中图片的真实宽高 */ public BufferedImage getBufferedI ...
- 关于联想超极本出现蓝屏Default Boot Device Missing or Boot Failed的解决办法
联想笔记本出现以下症状无法开机时: 解决方案:恢复BIOS默认设置,把硬盘设置为第一启动项. 若成功检测到硬盘并有EFI引导程序,那么恭喜你这就完事了,重启后就可以正常开机了. 但是,若在UEFI模式 ...
- js 随机生成信用卡号
本文实例讲述了JavaScript随机生成信用卡卡号的方法.分享给大家供大家参考.具体分析如下: 这段JS代码根据信用卡卡号产生规则随机生成信用卡卡号,是可以通过验证的,仅供学习参考,请不要用于非法用 ...
- nginx 限制ip/限制访问路径
一.多站点统一限IP vim nginx.conf allow 127.0.0.1; deny all; # 以上代码解释: # deny all; 限制所有的ip # allow ip; 除了 这个 ...
- HTTP请求与请求头
HTTP 的请求报文分为三个部分 请求行.请求头和请求体,格式如图:一个典型的请求消息头域,如下所示: POST/GET http://download.microtool.de:80/somedat ...
- Kafka .NET操作
Kafaka .NET连接 Kafka目前主流在用的.NET客户端有两个:一个是kafka-net,另外一个是Confluent.Kafka,这里给出使用示例: kafka-net示例: public ...
- c语言open()介绍
2013-09-0914:40:13 1. 头文件: #include <sys/types.h> #include <sys/stat.h> #include <fcn ...
- Aspose.Words进行Word替换(插入图片和水印)
由于最近一直在忙着做着Word打印模板的一些工作,就整理一些Asponse.Words对Word文档进行操作的资料. using System; using System.Collections.Ge ...
- Types in Javascript(jQuery)
String: 空字符串等于Boolean的false; htmlString: 包括起始tag和结束tag的字符串,代表html代码: Number:双精度64位,跟string一样属于immuta ...
- QS之vsim
vsim - The vsim command invokes the VSIM simulator -L <library_name> … (optional) Specifies th ...