2019杭电多校一 C. Milk (dp)
大意: $n*m$棋盘, 初始位置$(1,1)$, 横坐标为$\frac{m+1}{2}$时可以向下走, 否则只能左右走, 每走一步花费$1$秒. 有$k$管奶, 第$i$罐位置$(r_i,c_i)$, 要花费$t_i$的时间去喝. 对于所有的$1\le i\le k$, 求出喝完$i$管奶最短用时.
实现略复杂的$dp$题, 直接按照官方题解写了.
主要思路是对每一行求出向左/向右喝$x$罐奶的最少用时, 然后$dp$合并答案.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define x first
#define y second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll INF = 1e15;
const int N = 1e4+10;
int n, m, k, b[N];
struct {int x,y,t;} a[N];
ll ans[N];
vector<pii> v[N];
vector<ll> solve(vector<pii> a, int s, int x) {
a.insert(a.begin(),pii(s,0));
vector<ll> ret(a.size(),INF), t(ret);
ret[0] = x==-1?0:abs(x-s);
t[0] = 0;
for (int i=1; i<a.size(); ++i) {
int len = abs(a[i].x-a[i-1].x);
REP(j,0,i-1) t[j]+=len;
PER(j,1,i) t[j]=min(t[j],t[j-1]+a[i].y);
REP(j,1,i) ret[j]=min(ret[j],t[j]+(x==-1?0:abs(x-a[i].x)));
}
return ret;
}
vector<ll> Merge(const vector<ll> &L, const vector<ll> &R) {
vector<ll> ret(L.size()+R.size()-1,INF);
for (int i=0;i<L.size();++i) {
for (int j=0;j<R.size();++j) {
ret[i+j] = min(ret[i+j], L[i]+R[j]);
}
}
return ret;
} void work() {
scanf("%d%d%d", &n, &m, &k);
*b = 0;
REP(i,1,k) {
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);
b[++*b] = a[i].x;
}
b[++*b] = 1;
sort(b+1,b+1+*b),*b=unique(b+1,b+1+*b)-b-1;
REP(i,1,*b) v[i].clear();
REP(i,1,k) {
a[i].x=lower_bound(b+1,b+1+*b,a[i].x)-b;
v[a[i].x].pb(pii(a[i].y,a[i].t));
ans[i] = INF;
}
REP(i,1,*b) sort(begin(v[i]),end(v[i]));
auto g = solve(v[1],1,-1);
for (int i=0;i<g.size();++i) {
ans[i] = min(ans[i], g[i]);
}
int cur = 0;
vector<ll> f[2];
f[0] = solve(v[1],1,(m+1)/2);
REP(i,2,*b) {
cur ^= 1;
auto p = lower_bound(begin(v[i]),end(v[i]),pii((m+1)/2,0));
vector<pii> L(begin(v[i]),p), R(p,end(v[i]));
reverse(begin(L),end(L));
auto f0 = solve(L,(m+1)/2,(m+1)/2), f1 = solve(R,(m+1)/2,(m+1)/2);
auto g0 = solve(L,(m+1)/2,-1), g1 = solve(R,(m+1)/2,-1);
g0 = Merge(f1,g0), g1 = Merge(f0,g1);
auto g = g0;
for (int j=0;j<g.size();++j) {
g[j] = min(g[j], g1[j]);
}
g = Merge(f[!cur],g);
f[cur] = Merge(f[!cur],Merge(f0,f1));
for (int j=0;j<g.size();++j) {
ans[j] = min(ans[j], g[j]+b[i]-b[i-1]);
f[cur][j] += b[i]-b[i-1];
}
}
REP(i,1,k) {
if (i==k) printf("%lld\n",ans[i]);
else printf("%lld ",ans[i]);
}
} int main() {
int t;
scanf("%d", &t);
while (t--) work();
}
2019杭电多校一 C. Milk (dp)的更多相关文章
- 2019杭电多校一 A. Blank (dp)
大意: 长为$n$的数组, 每个位置范围$[0,3]$, $m$个限制$(l,r,x)$表示$[l,r]$内有$x$种数, 求方案数. 维护每个数字最后一次出现位置, 暴力$DP$ 实现时有个技巧是把 ...
- [2019杭电多校第八场][hdu6667]Roundgod and Milk Tea
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6667 题目大意是说n个班级,每个班级有ai人和bi杯茶,每个人只能喝其他班的茶并且只能喝一杯.问最多有 ...
- 2019杭电多校&CCPC网络赛&大一总结
多校结束了, 网络赛结束了.发现自己还是太菜了,多校基本就是爆零和签到徘徊,第一次打这种高强度的比赛, 全英文,知识点又很广,充分暴露了自己菜的事实,发现数学还是很重要的.还是要多刷题,少玩游戏. 网 ...
- 2019杭电多校第一场hdu6581 Vacation
Vacation 题目传送门 update(O(n)) 看了那个O(n)的方法,感觉自己想的那个O(nlogn)的好傻,awsl. 0车最终通过停车线的时候,状态一定是某个车堵住后面的所有车(这个车也 ...
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...
- 2019杭电多校第二场hdu6602 Longest Subarray(线段树)
Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...
- Rikka with Game[技巧]----2019 杭电多校第九场:1005
Rikka with Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Othe ...
- 2019杭电多校 hdu6662 Acesrc and Travel (树形dp
http://acm.hdu.edu.cn/showproblem.php?pid=6662 题意:有两个人在树上博弈,每个点节点有两个分数a[i]和b[i],先手先选择一个点,后手在先手选的点的相邻 ...
- 2019杭电多校 hdu6659 Acesrc and Good Numbers
http://acm.hdu.edu.cn/showproblem.php?pid=6659 题意:给你d,x,让求满足f(d,n)=n的最大n(n<=x),其中f(d,n)表示数字d在从1到n ...
随机推荐
- Bean Shell常用内置变量
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log文件,使用方法:log.info( ...
- IIS/VS IIS Express 添加MIME映射 svg、woff、woff2、json
出现问题 页面提示 font-awesome/fonts/fontawesome-webfont.woff2?v=4.3.0 Failed to load resource: the server r ...
- javascript 的垃圾回收机制讲一下
定义:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束. 像 C 这样的编程语言,具有低级内存管理原语,如 malloc()和 free().开发人员使用这些原语显式地对操作系统的内存进行 ...
- PowerDesigner 使用小结
这里总结一篇关于数据建模工具 PowerDesigner 的使用小技巧,下面列出的两个应用场景要在网上现找解决方案的话还真不一定好找,所以选择将这两个棘手的问题先记下来. 1. PDM 中表间关系出现 ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_14-细粒度授权-我的课程细粒度授权-需求分析
3.3 我的课程细粒度授权 3.3.1 需求分析 1.我的课程查询,细粒度授权过程如下: 1)获取当前登录的用户Id 2)得到用户所属教育机构的Id 3)查询该教学机构下的课程信息 最终实现了用户只允 ...
- Spring走向注解驱动编程
SpringFramework的两大核心,IOC(Inversion of control)控制反转和DI(Dependency Inject)依赖注入,其推崇的理念是应用系统不应以java代码的方式 ...
- IE和火狐的css兼容性问题
CSS对浏览器器的兼容性具有很高的价值,通常情况下IE和Firefox存在很大的解析差异,这里介绍一下兼容要点. 1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-le ...
- 【Leetcode_easy】783. Minimum Distance Between BST Nodes
problem 783. Minimum Distance Between BST Nodes 参考 1. Leetcode_easy_783. Minimum Distance Between BS ...
- 移动端APP测试总结
移动APP测试,除了基础功能测试测试方法外,需要额外关注以下方面: 兼容性测试 流量测试 电量测试 弱网络测试 稳定性测试 安全测试 环境相关测试 apk性能测试 兼容性测试 针对App通常会考虑这些 ...
- 【c# 学习笔记】类实例化
类中可以定义的成员,包括字段.属性.构造函数.实例方法和析构函数等. 要访问这些实例成员,必须通过类的实例对象来完成.而要得到一个类的实例对象,就必须先声明一个该类类型的变量,然后使用new运算符后跟 ...