[codevs3729]飞扬的小鸟
[codevs3729]飞扬的小鸟
试题描述

输入

输出
输出文件名为 bird.out。
共两行。
第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0。
第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数,
否则,输出小鸟最多可以通过多少个管道缝隙。
输入输出示例


数据规模及约定
对于 30%的数据:5≤n≤10,5≤m≤10,k=0,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次;
对于 50%的数据:5≤n≤20,5≤m≤10,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次;
对于 70%的数据:5≤n≤1000,5≤m≤100;
对于 100%的数据: 5≤n≤10000, 5≤m≤1000, 0≤k<n, 0<X<m, 0<Y<m, 0<P<n, 0≤L<H ≤m,L +1<H。
题解
设 f[i][j] 表示横坐标在 i,纵坐标在 j 的最小点击次数(若不能达到这个点则为正无穷)。考虑每次转移,从 i-1 到 i,点击 k 次,纵坐标增加 X[i-1] * k(增加后不能超过 m);或者不点击,纵坐标减小 Y[i-1]。
然而这样的转移是 O(n / X[i]) 的,当 X[i] 比较小时就过不了了,于是我们可以对 f[i][j] 的 j,及纵坐标进行模 X[i-1] 分类,然后维护一下前缀最小值即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 1010
#define maxl 10010
#define oo 2147483647
int n, m, k, f[2][maxn], minf[maxn], X[maxl], Y[maxl];
struct Tun {
int up, low, x;
Tun() {}
Tun(int _1, int _2, int _3): up(_1), low(_2), x(_3) {}
bool operator < (const Tun& t) const { return x < t.x; }
} ts[maxl]; int main() {
n = read(); m = read(); k = read();
for(int i = 0; i < n; i++) X[i] = read(), Y[i] = read();
for(int i = 1; i <= k; i++) {
int p = read(), l = read(), h = read();
ts[i] = Tun(h, l, p);
}
sort(ts + 1, ts + k + 1); f[0][0] = oo;
for(int i = 1; i <= m; i++) f[0][i] = 0;
int cur = 1, kt = 1, at;
for(int i = 1; i <= n; i++, cur ^= 1) {
for(int j = 0; j <= m; j++) minf[j] = f[cur][j] = oo;
for(int j = 1; j <= m; j++)
if(j >= X[i-1]) {
int lf = f[cur^1][j-X[i-1]], mf = minf[j%X[i-1]];
minf[j%X[i-1]] = min(mf == oo ? oo : mf + 1, lf == oo ? oo : lf + 1);
f[cur][j] = min(f[cur][j], minf[j%X[i-1]]);
}
for(int j = m + 1; j <= m + X[i-1]; j++) {
int lf = f[cur^1][j-X[i-1]], mf = minf[j%X[i-1]];
minf[j%X[i-1]] = min(mf == oo ? oo : mf + 1, lf == oo ? oo : lf + 1);
f[cur][m] = min(f[cur][m], minf[j%X[i-1]]);
}
for(int j = 1; j <= m - Y[i-1]; j++)
f[cur][j] = min(f[cur][j], f[cur^1][j+Y[i-1]]);
if(kt <= k && ts[kt].x == i) {
// puts("here");
for(int j = 1; j <= ts[kt].low; j++) f[cur][j] = oo;
for(int j = ts[kt].up; j <= m; j++) f[cur][j] = oo;
kt++;
}
// for(int j = 1; j <= m; j++) printf("%d ", f[cur][j] < oo ? f[cur][j] : -1); putchar('\n');
for(int j = 1; j <= m; j++) if(f[cur][j] < oo) {
at = kt - 1; break;
}
} int ans = oo;
for(int i = 1; i <= m; i++) ans = min(ans, f[cur^1][i]);
if(ans < oo) printf("1\n%d\n", ans);
else printf("0\n%d\n", at); return 0;
}
[codevs3729]飞扬的小鸟的更多相关文章
- P1907飞扬的小鸟
P1907飞扬的小鸟 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或 ...
- Codevs 3729==洛谷P1941 飞扬的小鸟
P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 Flappy Bird 是一 ...
- NOIP2014 飞扬的小鸟
3. 飞扬的小鸟 (bird.cpp/c/pas) [问题描述] Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的 ...
- Codevs 3729 飞扬的小鸟
飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...
- [NOIP2014][DP]飞扬的小鸟
[NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...
- Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...
- UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP
#17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:// ...
- P1941 飞扬的小鸟(背包)
P1941 飞扬的小鸟 细节题 上升是完全背包 下降是01背包 (数组访问越界本机怎么能过???(大雾)) #include<iostream> #include<cstdio> ...
- 洛谷 P1941 飞扬的小鸟
洛谷 P1941 飞扬的小鸟 原题链接 首先吐槽几句 noip都快到了,我还不刷起联赛大水题! 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节 ...
随机推荐
- C#中值类型和引用类型图解
举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...
- hadoop2.6.4运行wordcount
hadoop用户登录,启动服务: start-dfs.sh && start-yarn.sh 创建输入目录: hadoop df -mkdir /input 把测试文件导入/input ...
- PS------“窗口” -> "扩展功能"使用方法
http://forum.xitek.com/thread-1330039-1-1-1.html
- 2016 年 Python 开发者调查结果
1.在团队中工作 vs 独立工作 有趣的是,半数的受访者大部分时间在团队中工作,而另外半数的受访者则独立的做项目. 在公司中工作 vs 独立从事自己的项目 大约80%的受访者告诉我们,他们在公司里面工 ...
- ubuntu下eclipse遇到The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
JSP页面顶端出现“红色”的报错信息:The superclass "javax.servlet.http.HttpServlet" was not found on the Ja ...
- Java反射机制<2>
反射机制还可以调用类中的指定方法或指定属性,并且可以通过反射完成对数组的操作. 通过反射调用类中的方法 import java.lang.reflect.Method; //============= ...
- mysql优化--触发器和auto_increment
1.触发器: 触发器的好处:做数据回收站或者做数据关联删除 触发器的坏处:给数据库增加压力,增删改变慢,不利与mysql移到其他数据库会出问题. 触发器建立:只能增删改,查不能建立. 例子1:创建一个 ...
- Saltstack pillar组件
pillar组件 pillar也是Saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模板.state.API等.在pillar中定义的数据与 ...
- Effective Objective-C 2.0 — 第10条:在既有类中使用关联对象存放自定义数据
可以通过“关联对象”机制来把两个对象连起来 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系” 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难于 ...
- 在CentOS上搭建apache和PHP服务器环境(转)
1.您也可以使用一键自动部署环境的工具,请参见网友开发的这个工具 http://www.centos.bz/2013/08/ezhttp-tutorial/ 2. 安装: wget -c http:/ ...