这道题对于第13个数据点,不知为什么f数组第二位开到2000以下就不能过,求指教

飞扬的小鸟

传送门

题目大意

一个小鸟在\(n*m\)的方阵里,然后有许多管道你们玩过就不多介绍了,然后每一个位置,点击会上升,不点击可以下降,点击效果可以叠加。

求如果通关的最小点击次数,否则会最多通过多少个管道。

solution

30pts

就是搜索,本以为会拿50pts。

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <queue>
  5. #include <cstdio>
  6. using namespace std;
  7. int n,m,k,up[20000],down[20000],vis[20000],flag,maxn,minn=0x7fffffff;
  8. struct edge {
  9. int u,d;
  10. } e[20000];
  11. void dfs(int x,int h,int tot) {
  12. if(h<=0) return ;
  13. maxn=max(maxn,x);
  14. if(x==n+1 && h>0) {
  15. flag=true;
  16. minn=min(minn,tot);
  17. return;
  18. }
  19. if(vis[x+1]) {
  20. for(int i=1; i<=3; i++) {
  21. if(h+up[x]*i<e[x+1].u && h+up[x]*i>e[x+1].d )dfs(x+1,((h+up[x]*i<=m)?(h+up[x]*i):m),tot+i);
  22. }
  23. if(h-down[x]<e[x+1].u && h-down[x]>e[x+1].d ) dfs(x+1,h-down[x],tot);
  24. }
  25. else {
  26. for(int i=1; i<=3; i++) {
  27. dfs(x+1,((h+up[x]*i)<=m?(h+up[x]*i):m),tot+i);
  28. }
  29. dfs(x+1,h-down[x],tot);
  30. }
  31. }
  32. int main() {
  33. scanf("%d%d%d",&n,&m,&k);
  34. for(int i=0; i<=n-1; i++)
  35. scanf("%d%d",&up[i],&down[i]);
  36. for(int i=1; i<=k; i++) {
  37. int a,b,c;
  38. scanf("%d%d%d",&a,&b,&c);
  39. vis[a]=1;
  40. e[a].u=c;
  41. e[a].d=b;
  42. }
  43. for(int i=0; i<=m; i++)
  44. if(vis[i] && i>e[i].d && i<e[i].u)
  45. dfs(0,i,0);
  46. else dfs(0,i,0);
  47. if(flag==true) {
  48. printf("1\n%d",minn);
  49. } else {
  50. int ans=0;
  51. for(int i=0; i<=maxn; i++)
  52. if(vis[i])ans++;
  53. printf("0\n%d",ans);
  54. }
  55. return 0;
  56. }

100pts

动态规划

这道题如果细想,还真是可以用背包做,虽然限制条件多了一点。

如果小鸟向上飞,则是完全背包。

如果小鸟向下飞,则是01背包。

如果小鸟遇到柱子,那么将此状态取消

如果小鸟飞到m以上,那么定为m。

最后输出倒叙查询dp数组就可以了

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. int f[10010][2010];
  6. int n,m,k;
  7. int x[10010],y[10010];
  8. int vis[10010];
  9. int low[10010],high[10010];
  10. int main() {
  11. scanf("%d%d%d",&n,&m,&k);
  12. for(int i=1; i<=n; ++i) scanf("%d%d",&x[i],&y[i]);
  13. for(int i=1; i<=n; ++i) low[i]=1,high[i]=m;
  14. for(int i=1; i<=k; ++i) {
  15. int a,b,c;
  16. scanf("%d%d%d",&a,&b,&c);
  17. vis[a]=1;
  18. low[a]=b+1;
  19. high[a]=c-1;
  20. }
  21. memset(f,0x3f,sizeof(f));
  22. for(int i=1; i<=m; ++i) f[0][i]=0;
  23. for(int i=1; i<=n; ++i) {
  24. for(int j=x[i]+1; j<=m+x[i]; ++j)
  25. f[i][j]=min(f[i-1][j-x[i]]+1,f[i][j-x[i]]+1);//如果向上飞
  26. for(int j=m+1; j<=m+x[i]; ++j)//将超过m的更新到m
  27. f[i][m]=min(f[i][m],f[i][j]);
  28. for(int j=1; j<=m-y[i]; ++j)//如果向下飞
  29. f[i][j]=min(f[i][j],f[i-1][j+y[i]]);
  30. for(int j=1; j<low[i]; ++j)//遇到柱子直接g
  31. f[i][j]=f[0][0];
  32. for(int j=high[i]+1; j<=m; ++j)
  33. f[i][j]=f[0][0];
  34. }
  35. int ans=f[0][0];
  36. for(int j=1; j<=m; ++j)
  37. ans=min(ans,f[n][j]);
  38. if(ans<f[0][0]) printf("1\n%d",ans);
  39. else {
  40. int i,j;
  41. for(i=n; i>=1; i--) {
  42. for(j=1; j<=m; ++j)
  43. if(f[i][j]<f[0][0]) break;
  44. if(j<=m) break;
  45. }
  46. ans=0;
  47. for(int p=1; p<=i; ++p)
  48. if(vis[p])ans++;
  49. printf("0\n%d",ans);
  50. }
  51. return 0;
  52. }

luogu 1941 飞扬的小鸟的更多相关文章

  1. luogu P1941 飞扬的小鸟

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

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

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

  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. Oracle 11G R2 RAC中的scan ip 的用途和基本原理

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

  2. CaffeNet用于Flickr Style数据集上的风格识别

    转自 http://blog.csdn.net/liumaolincycle/article/details/48501423 微调是基于已经学习好的模型的,通过修改结构,从已学习好的模型权重中继续训 ...

  3. mac下安装postgreSql

    在 mac 下,可以利用 homebrew 直接安装 PostgreSQL: 1 brew install postgresql -v 稍等片刻,PostgreSQL 就安装完成.接下来就是初始数据库 ...

  4. User_Login_Register_Shopping+装饰器 3.0

    #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/5/27 0027 14:07# @Author : Anthony.Waa# @ ...

  5. 微信公众号测试账号-redirect_uri域名与后台配置不一致,错误代码:10003

    微信公众号测试账号-redirect_uri域名与后台配置不一致,错误代码:10003 进入公众平台测试账号. 登录公众账号--"开发者中心"--"公众平台测试账号&qu ...

  6. Linux 搭建互信后,仍需要密码验证

    修改ssh配置文件: vi /etc/ssh/sshd_config PermitRootLogin no 注释掉

  7. intell-

    intellect: n.[U, C] the ability to think in a logical way and understand things, especially at an ad ...

  8. C++下面关于字符串数组的一些操作

    今天在写一个搜索引擎的分词系统,是很简单的那种,但是居然费了我一天的时间还没完成,晚上估计还得弄一会了,但是在这个过程中,遇到了集中关于字符串数组的操作,值得和大家分享一下. 首先是关于统计字符串数组 ...

  9. LeetCode Golang 7. 整数反转

    7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. Tips : Math包给出的类型大小的边界: // Integer limit values. const ...

  10. servlet缺省路径

    servlet缺省路径 servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径.该路径对应的是一个Defaul ...