【Link】:

【Description】



直线上有n(n≤10000)个点,其中第i个点的坐标是xi,且它会在di秒之后消失。Alibaba 可以从任意位置出发,求访问完所有点的最短时间。无解输出No solution。

恰好在di秒到的话,不算到

【Solution】



访问到点的时候,因为是秒取点的;

所以最后的答案肯定是一段区间;

按照之前区间动规的思路;

假设当前到了[l..r]这段区间的最左边/最右边;

然后枚举下一个要到哪里(l-1或r+1);

但是这样定义状态是不可行的;

因为要开一个1W*1W的数组;

于是我们按照区间的长度作为状态;

可以发现之前定义的状态;

可以按照区间的长度来递推;

可以发现都是从长度为l的区间递推到长度为l+1的区间

可以枚举一下区间的左端点,然后做一下顺推;

因为只从l递推到l+1;

则可以用滚动数组了;

只需定义f[2][1e4][2]即可;

第一维代表区间长度,(上一个长度和当前长度),第二维代表区间的左端点,第三维表示在这个区间的左端还是右端;

最后答案在f[n&1][1][0]和f[n&1][1][1]里面找即可;

刚好在b[i]的时候到达a[i]不算到达



【NumberOf WA】



1



【Reviw】



发现只是由前一个状态递推到后一个状态的话;

都能用滚动数组优化空间;

以后都把int定义为long long :)



【Code】

#include <bits/stdc++.h>
#define int long long
using namespace std; const int N = 1e4;
const int INF = 0x3f3f3f3f; int n,a[N+10],b[N+10],f[2][N+10][2]; main(){
//freopen("F:\\rush.txt","r",stdin);
while (~scanf("%lld",&n)){
for (int i = 1;i <= n;i++)
scanf("%lld%lld",&a[i],&b[i]);
for (int i = 1;i <= n;i++){
f[1][i][0] = f[1][i][1] = (b[i]>0?0:INF);
}
for (int i = 1;i <= n-1;i++){
int cur = i&1;
memset(f[cur^1],INF,sizeof f[cur^1]);
for (int j = 1;j <= n-i+1;j++){
if (f[cur][j][0]<INF){
// l = j,r = j+i-1,0
// l = j-1,r = j-1+i+1-1 = j+i-1
if (j >= 2){
f[cur^1][j-1][0] = min(f[cur^1][j-1][0],f[cur][j][0]+a[j]-a[j-1]);
if (f[cur^1][j-1][0]>=b[j-1])
f[cur^1][j-1][0] = INF;
}
//l = j,r = j+i+1-1 = j+i
if (j+i<=n){
f[cur^1][j][1] = min(f[cur^1][j][1],f[cur][j][0]+a[j+i]-a[j]);
if (f[cur^1][j][1] >= b[j+i])
f[cur^1][j][1] = INF;
}
}
if (f[cur][j][1]<INF){
// l = j,r = j+i-1,1
// l = j-1,r = j-1+i+1-1 = j+i-1
if (j >= 2){
f[cur^1][j-1][0] = min(f[cur^1][j-1][0],f[cur][j][1]+a[j+i-1]-a[j-1]);
if (f[cur^1][j-1][0]>=b[j-1])
f[cur^1][j-1][0] = INF;
}
//l = j,r = j+i+1-1 = j+i
if (j+i<=n){
f[cur^1][j][1] = min(f[cur^1][j][1],f[cur][j][1]+a[j+i]-a[j+i-1]);
if (f[cur^1][j][1] >= b[j+i])
f[cur^1][j][1] = INF;
}
}
}
}
int ans = min(f[n&1][1][0],f[n&1][1][1]);
if (ans>=INF)
puts("No solution");
else
printf("%lld\n",ans);
}
return 0;
}

【Uva 1632】Alibaba的更多相关文章

  1. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

    偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...

  2. 【贪心+中位数】【UVa 11300】 分金币

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  3. 【UVa 10881】Piotr's Ants

    Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...

  4. 【UVa 116】Unidirectional TSP

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  5. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  6. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 【uva 1025】A Spy in the Metro

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. 【Uva 11584】Partitioning by Palindromes

    [Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...

  9. 【Uva 11400】Lighting System Design

    [Link]: [Description] 你要构建一个供电系统; 给你n种灯泡来构建这么一个系统; 每种灯泡有4个参数 1.灯泡的工作电压 2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的 ...

随机推荐

  1. 学习Go语言之单例模式

    单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象 // 单例模式 package main ...

  2. Vuex-一个专为 Vue.js 应用程序开发的状态管理模式

    为什么会出现Vuex 非父子关系的组件如何进行通信?(Event Bus)bus.js import Vue from 'vue'; export default new Vue(); foo.vue ...

  3. unity C# StackOverflowException

    有时候图省事,属性这样写public int pageCount{get{return pageCount;}set{pageCount=value;}}可能会报栈溢出的错误, StackOverfl ...

  4. KM HDU 3718

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  5. 《R实战》读书笔记二

    第一章 R简单介绍 本章概要 1安装R 2理解R语言 3执行R程序 本章所介绍的内容概括例如以下. 一个典型的数据分析步骤如图1所看到的. 图1:典型数据分析步骤 简而言之,现今的数据分析要求我们从多 ...

  6. uva 473(dp)

    题意:按创作时间给出n首歌每首歌的时间ti,然后按创作时间装到m个光盘内,给出光盘最大分钟数t,问m个光盘最多总共放多少首歌. 题解:对于每首歌都能够选或者不选,假设选择了这首歌,是否把这首歌当做第j ...

  7. Codeforces Educational Codeforces Round 8 A. Tennis Tournament

    大致题意: 网球比赛,n个參赛者,每场比赛每位选手b瓶水+裁判1瓶水,所有比赛每一个參赛者p条毛巾 每一轮比赛有2^k个人參加比赛(k为2^k<=n中k的最大值),下一轮晋级人数是本轮每场比赛的 ...

  8. JavaWeb简单介绍

    服务器端编程 技术种类 Servlet JSP Struts Spring Hibernate EJB Web Service Web服务器 IIS Apache Tomcat (提供对JSP和Ser ...

  9. Mysql基础第二部分,针对以后python使用

    #外键 表与表相连 列名 MUL 外键 参照完整性 不能添加另一个表没有的字段create table study_record( id int auto_increment primary key, ...

  10. vSphere5安装配置视频教程

    vSphere5安装配置视频教程 本文出自 "李晨光原创技术博客" 博客,请务必保留此出处http://chenguang.blog.51cto.com/350944/819550