2018.12.1 万圣节的小L

  试题描述
  
  今天是万圣节,小L同学开始了一年一度的讨要糖果游戏,但是在刚刚过去的比赛中小有成就的他打算给自己增加一点难度:如果没有讨到每一家的糖果就算输。
  
  已知小L共有n(n不大于10000)个邻居,他们都在同一条街上(可以近似看成一条直线),第i个邻居的坐标是xi。L同学的妈妈会在一开始把他送到任意邻居的门前。现在已知所有邻居会在di时间后休息(休息以后不能再去打扰),求访问完所有点的最短时间,如果无解输出“No solution”。
  
  输入
  
  输入第一行为一个正整数表示n,接下来n行,每行两个用空格隔开的数,分别表示第i个邻居的位置和休息时间。
  
  输出
  
  输出一个数,表示最短时间,无解输出“No solution”。
  
  输入示例
  
  5
  
  1 3
  
  3 1
  
  5 8
  
  8 19
  
  10 15
  
  输出示例
  
  11
  
  看起来是一个搜索或者dp
  
  然鹅发现搜索会TLE
  
  考虑dp:
  
  为了转移我们存储的数据我们不能采用普通的区间dp
  
  我们不难发现,为了遍历直线上的每一个点,其中一个端点一定是最后经过的点(自己可以推一下)
  
  所以我们用dp[i][j][0]表示从i到j结束在左端点的最短时间
  
  用dp[i][j][1]表示从i到j结束在右端点的最短时间
  
  于是对于i到j+1的区间在合法范围内就有了两种选择:从i到j区间转移或者从i-1到j+1区间转移
  
  但是发现空间开不下于是我们换一种存储方式
  
  为了节省空间我们只存储区间起点(压缩一维存储区间长度奇数偶数)
  
  于是我们又有了四种转移方式:
  
  对于从i到j的区间,从i-1到j转移(两种)或者从i到j-1转移(两种)
  
  关于转移:
  
  对于区间dp来讲,无后效性体现在从一步到下一步的转移
  
  所以转移的代价是从结束时间到下一个节点的距离
  
  关于合法:主要就是时间不要超过
  
  上代码
  
  复制代码
  
  #include<iostream>
  
  #define INF 0x3f3f3f3f
  
  using namespace std;
  
  int n,dp[2][20010][2],xx[10005],d[10005],nx;
  
  int main()
  
  {
  
  scanf("%d",&n);
  
  for(int i=1;i<www.tianjiuyule178.com=n;i++)scanf("%d%d",&xx[i],&d[i]);
  
  for(int i=1;i<=n;i++)dp[0][i][0]=dp[0][i][1]=0;
  
  for(int i=1;i<www.haom178.com n;i++)
  
  {
  
  int x=nx;nx^=1;
  
  for(int j=1;j<=n-i;j++)
  
  {
  
  dp[nx][j][0]=min(dp[x][j+1][0]+xx[j+1]-xx[j],dp[x][j+1][1]+xx[j+i]-xx[j]);
  
  dp[nx][j][1]=min(dp[x][j][0]+xx[j+i]-xx[j],dp[x][j][1]+xx[j+i]-xx[j+i-1]);
  
  if(dp[nx][j][0]>d[j])dp[nx][j][0]=INF;
  
  if(dp[nx][j][1]>d[i+j])dp[nx][j][1]=INF;
  
  }
  
  }
  
  int ans=min(dp[nx][www.michenggw.com][0],dp[nx][1][1]);
  
  if(ans>=INF)puts("No www.mhylpt.com solution");
  
  else printf("%d",ans);
  
  return 0;
  
  }
  
  复制代码
  
  /*====年轻人,瞎搞是出不了省一的,这就是现实====*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值