【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. Studio3T 破解,无需命令计划任务

    最近项目中使用到了MongoDB,苦于命令行不好操作,所以就寻觅了一下MongDB的GUI管理工具,最终找到了Studio3T,功能非常强大,但是苦于只有评估版本30天,最可气的是一时手贱,修改了系统 ...

  2. oracle 12c 关于wm_concat 的替换;LISTAGG

    之所以用到了wm_concat函数.是想到达这样的结果集. 转为这样的===========> 返回这样的数据,易与配合echarts的数据准备. 看上去十分的方便,但是遗憾的是,oracle极 ...

  3. django orm 时间处理

    说明  datetime 类型赋值: 数据库设置时区为:utc 系统设置时区为:'Asia/Shanghai' 1.赋值为:‘2019-04-24 15:00:00’      数据库的结果为   ‘ ...

  4. python 爬虫简介

    初识Python爬虫 互联网 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现 ...

  5. python supper()函数

    参考链接:https://www.runoob.com/python/python-func-super.html super() 函数是用于调用父类(超类)的一个方法. class Field(ob ...

  6. HDU 4906 Our happy ending

    题意: Given a sequence a_1,a_2,...,a_n, if we can take some of them(each a_i can only be used once), a ...

  7. main()函数的形参

    main函数中的第一个参数argc代表的是向main函数传递的参数个数,第二个参数argv数组代表执行的程序名称和执行程序时输入的参数 #include <stdio.h> int mai ...

  8. UVa 11085 - Back to the 8-Queens

    题目:给你一个棋盘上的八个皇后.每行一个.如今让他们互相不攻击,每一个皇后仅仅能竖着移动, 一次能够移动到本列的不论什么位置,问最少移动几步.能满足要求. 分析:搜索,八皇后.由于八皇后仅仅有92组解 ...

  9. windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)

    郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...

  10. SQL调用Webservices

    IF NOT object_id('proc_CallWebServices') IS NULL DROP PROCEDURE proc_CallWebServices GO CREATE PROCE ...