https://www.luogu.org/problemnew/show/P1941

Bfs or Dp

#include <bits/stdc++.h>

using namespace std;
const int N = 1e4 + ; #define gc getchar()
#define oo 99999999 struct Node_1 {
int X, D, U;
} P[N];
struct Node_2 {
int U, D;
} M[N];
struct node {
int x, y, step;
}; int n, m, k;
int Answer = oo, Maxx; queue <node> Q; inline int read() {
int x = ;
char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} int up, down;
int vis[N][]; inline void Bfs() {
for(int i = m; i >= ; i --) {
node now;
now.x = ;
down = i - M[].D, up = i + M[].U;
if(down > P[].D && down < P[].U && vis[][down] == ) {
now.y = down;
now.step = ;
vis[now.x][now.y] = ;
Q.push(now);
} if(up > P[].D && up < P[].U && vis[][up] == ) {
now.y = min(up, m);
vis[now.x][now.y] = ;
now.step = ;
Q.push(now);
} }
while(!Q.empty()) {
node topp = Q.front();
Q.pop();
Maxx = max(Maxx, topp.x);
if(topp.x == n + ) {
Answer = min(Answer, topp.step);
continue ;
}
int y = topp.y, x = topp.x;
node nxt;
nxt.x = x + ;
down = y - M[x].D, up = y + M[x].U;
if(down > P[x + ].D && down < P[x + ].U) {
nxt.y = down;
nxt.step = topp.step;
if(vis[nxt.x][nxt.y] == ) {
vis[nxt.x][nxt.y] = nxt.step;
Q.push(nxt);
} else {
if(vis[nxt.x][nxt.y] > nxt.step) {
Q.push(nxt);
vis[nxt.x][nxt.y] = nxt.step;
}
}
}
nxt.y = up;
nxt.step = topp.step;
up = min(up, m);
while(up > P[x + ].D && up < P[x + ].U) {
nxt.y = min(nxt.y, m);
if(vis[nxt.x][nxt.y] == ) {
nxt.step ++;
vis[nxt.x][nxt.y] = nxt.step;
Q.push(nxt);
} else {
if(vis[nxt.x][nxt.y] > nxt.step + ) {
nxt.step ++;
Q.push(nxt);
vis[nxt.x][nxt.y] = nxt.step;
}
}
if(nxt.y == m) break;
nxt.y += M[x].U;
up = min(nxt.y, m);
}
}
} int main() {
n = read();
m = read();
k = read();
for(int i = ; i <= n; i ++)
M[i].U = read(), M[i].D = read(), P[i].U = m + ;
P[n + ].U = m + ;
for(int i = ; i <= k; i ++) {
int X = read() + ;
P[i].X = X;
P[X].D = read();
P[X].U = read();
}
Bfs();
if(Answer != oo) cout << << "\n" << Answer;
else {
cout << << "\n";
int js();
for(int i = ; i <= k; i ++) if(P[i].X <= Maxx) js ++;
cout << js;
} return ;
}
/*
5 5 0
3 3
2 1
2 3
2 1
3 2
*/
#include<cstdio>
#include<cctype>
#include<algorithm>
#define N 10003
#define M 1003
#define For(i,j,k) for(int i=j;i<=k;++i)
int read() {
int x=,l=;
char ch=getchar();
while(!isdigit(ch)) {
if (ch=='-') l=-;
ch=getchar();
}
while(isdigit(ch)) x=x*+(ch^),ch=getchar();
return x*l;
}
using namespace std;
int a[N][M],x[N],y[N],hi[N]; //a存到当前点的最优步数
short hk[M<<],wal[M<<]; //hk记列,wal记行,这只是循环队列,不要在意变量名
bool fl[N][M],mp[N][M],li[N]; //fl--某个点有没有被走过,mp--某个点有没有管子,li--记录某一列能不能到
int main() {
int an,n=read(),m=read(),k=read(),mo,ha,jzm,l=,r,ac,p=,kk,ff;
ac=m<<;
For(i,,n-) x[i]=read(),y[i]=read(),hi[i]=; //hi记录某一列上限,如果是最大值表示无上限
For(i,,k) {
jzm=read(),mo=read(),ha=read(); //不要在意变量名x2
For(j,,mo) mp[jzm][j]=;
For(j,ha,m) mp[jzm][j]=;
hi[jzm]=ha-; //mp,hi标记
}
r=m;
For(i,,m) wal[i]=i; //第0列入队
while(l<r) {
l++;
mo=hk[l%ac];
ha=wal[l%ac];
ff=an=;
li[mo]=;
if (mo==n) continue;
kk=min(m,hi[mo+]);
for(int i=ha+x[mo]; i<=kk; i+=x[mo]) { //枚举当前点可以到的点
an++;
if (mp[mo+][i]) continue; //判断当前有没有管道(下面的,碰上面管道就退循环了)
if (!fl[mo+][i]) { //没走过就入队
fl[mo+][i]=;
r++;
hk[r%ac]=mo+;
wal[r%ac]=i;
a[mo+][i]=a[mo][ha]+an;
} else if (a[mo+][i]>a[mo][ha]+an) a[mo+][i]=a[mo][ha]+an; //更新值
if (fl[mo][i]&&a[mo][i]<=a[mo][ha]+an) {
ff=;
break;
}
//重要剪枝!如果当前点顶上有点比他更优那就可以退了
//但是在这之前的循环是必要的,因为这时走的点是他顶上那个点走不到的
}
if (!mp[mo+][m]&&!ff) { //特判到顶的情况
if (!fl[mo+][m]) {
fl[mo+][m]=;
r++;
hk[r%ac]=mo+;
wal[r%ac]=m;
a[mo+][m]=a[mo][ha]+an+;
} else if (a[mo+][m]>a[mo][ha]+an+) a[mo+][m]=a[mo][ha]+an+;
}
if (ha-y[mo]>) { //特判下降情况
jzm=ha-y[mo];
if (!mp[mo+][jzm]) {
if (!fl[mo+][jzm]) {
fl[mo+][jzm]=;
r++;
hk[r%ac]=mo+;
wal[r%ac]=jzm;
a[mo+][jzm]=a[mo][ha];
} else if (a[mo+][jzm]>a[mo][ha]) a[mo+][jzm]=a[mo][ha];
}
}
}
for(int i=n; i>=; i--) //输出
if (li[i]) {
if (i==n) {
printf("1\n");
an=;
For(j,,m) if (an>a[n][j]&&fl[n][j]) an=a[n][j];
printf("%d\n",an);
return ;
}
printf("0\n");
an=;
for(int j=i; j>=; j--) if (hi[j]!=) an++;
printf("%d\n",an);
return ;
}
}
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXDP=;
int l[],h[];
int dp[][];
int x[],y[];
bool p[];
int main() {
int n,i,j,k,m,w;
scanf("%d%d%d",&n,&m,&k);
for(i=; i<n; i++) {
scanf("%d%d",&x[i],&y[i]);
l[i]=;
h[i]=m+;
}
l[n]=;
h[n]=m+;
for(i=; i<k; i++) {
scanf("%d",&w);
scanf("%d%d",&l[w],&h[w]);
p[w]=true;
}
for(i=; i<=n; i++) {
for(j=; j<=m; j++) {
dp[i][j]=MAXDP;
}
}
dp[][]=MAXDP;
for(i=; i<=m; i++) {
dp[][i]=;
}
for(i=; i<=n; i++) {
for(j=x[i-]; j<=m; j++) {
if(j==m) {
for(w=m-x[i-]; w<=m; w++) {
dp[i][j]=min(dp[i][j],dp[i-][w]+);
dp[i][j]=min(dp[i][j],dp[i][w]+);
}
}
dp[i][j]=min(dp[i][j],dp[i-][j-x[i-]]+);
dp[i][j]=min(dp[i][j],dp[i][j-x[i-]]+);
}
for(j=max(,l[i]+); j<=min(m-y[i-],h[i]-); j++) {
dp[i][j]=min(dp[i][j],dp[i-][j+y[i-]]);
}
for(j=l[i]; j>=; j--) {
dp[i][j]=MAXDP;
}
for(j=h[i]; j<=m; j++) {
dp[i][j]=MAXDP;
}
}
int ans=MAXDP;
int cnt=k;
for(i=n; i>=; i--) {
for(j=l[i]+; j<=h[i]-; j++) {
ans=min(ans,dp[i][j]);
}
if(ans<MAXDP) {
break;
}
if(p[i]==true) {
k--;
}
}
if(cnt==k) {
printf("1\n%d",ans);
} else {
printf("0\n%d",k);
}
return ;
}

[Luogu] 飞扬的小鸟的更多相关文章

  1. Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)

    Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...

  2. luogu 1941 飞扬的小鸟

    这道题对于第13个数据点,不知为什么f数组第二位开到2000以下就不能过,求指教 飞扬的小鸟 传送门 题目大意 一个小鸟在\(n*m\)的方阵里,然后有许多管道你们玩过就不多介绍了,然后每一个位置,点 ...

  3. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  4. P1907飞扬的小鸟

    P1907飞扬的小鸟 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或 ...

  5. [codevs3729]飞扬的小鸟

    [codevs3729]飞扬的小鸟 试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果 ...

  6. Codevs 3729==洛谷P1941 飞扬的小鸟

    P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 Flappy Bird 是一 ...

  7. NOIP2014 飞扬的小鸟

    3. 飞扬的小鸟 (bird.cpp/c/pas) [问题描述] Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的 ...

  8. Codevs 3729 飞扬的小鸟

    飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...

  9. [NOIP2014][DP]飞扬的小鸟

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

随机推荐

  1. Photon Server LoadBalancing搭建

    准备:申请3台Windows虚拟机. 3台虚拟机上都部署上Photon Server. 一.主虚拟机上部署MasterServer. (1)在第一台虚拟机中,部署的Photon Server目目录下找 ...

  2. python time模块认识

    time 模块 -- 时间获取和转换 time 模块提供各种时间相关的功能 在python中, 与时间处理有关的模块包括: time, datatime 以及 calendar 必要说明!: 虽然这个 ...

  3. StorageClass-动态PVC

    StorageClass 之前我们部署了PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上 ...

  4. Idea加载项目扫描完毕后自动退出

    问题描述:Idea平时好好的,突然就打开后扫描完毕后自动退出.网上说修改idea.exe.vmoptions文件的Xmx,还是不行. 后来根据http://www.pianshen.com/artic ...

  5. django+uwsgi+nginx: websock 报502/400

    耽搁了近2个月,终于解决了,主要是nginx/uwsgi/django相关的配置: 一.django工程settings.py,添加 WEBSOCKET_FACTORY_CLASS = "d ...

  6. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

  7. Python爬取爱奇艺资源

    像iqiyi这种视频网站,现在下载视频都需要下载相应的客户端.那么如何不用下载客户端,直接下载非vip视频? 选择你想要爬取的内容 该安装的程序以及运行环境都配置好 下面这段代码就是我在爱奇艺里搜素“ ...

  8. LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II

    贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ...

  9. 基于PROMISE解决回调地狱问题

    回调地狱问题: 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数, ...

  10. 系统性能分析-vmstat命令详解

    最近温馨巩固Linux 操作系统的 vmstat命令,这个命令所能打印的系统信息满多的,比较好用,就顺当记录下重要的点,方便以后排查系统问题时拿出来用 字段 含义 procs 进程信息字段: -r:正 ...