luoguP1941-

20分&50分:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = 20005;
  7. int n,m,k,x[N],y[N],ans,sum,book[N];
  8. int f[10005][1005];
  9. struct node{
  10. int p,l,h;
  11. }v[N];
  12. bool flag;
  13. inline int read()
  14. {
  15. int ans=0,w=1;
  16. char c=getchar();
  17. while((c<'0'||c>'9')&&c!='-') c=getchar();
  18. if(c=='-') { w=-1; c=getchar(); }
  19. while(c>='0'&&c<='9')
  20. { ans=ans*10+c-'0'; c=getchar(); }
  21. return ans*w;
  22. }
  23. int min(int a,int b)
  24. { if(a<b) return a; return b; }
  25. int max(int a,int b)
  26. { if(a>b) return a; return b; }
  27. bool cmp(node a,node b)
  28. { return a.p<b.p; }
  29. void dfs(int t,int high,int ansp,int sumt)
  30. {
  31. high=min(high,m);
  32. if(ansp>ans) return ;
  33. if(high<=0) return ;
  34. if(book[t])
  35. { if(high>=v[book[t]].h||high<=v[book[t]].l) return ; }
  36. if(t>=n) { flag=1; ans=min(ans,ansp); return ;}
  37. if(book[t]) ++sumt;
  38. sum=max(sum,sumt);
  39. dfs(t+1,high-y[t],ansp,sumt);
  40. for(int i=1;i<=3;i++)
  41. dfs(t+1,high+i*x[t],ansp+i,sumt);
  42. }
  43. void print(int u)
  44. {
  45. int sum=0;
  46. for(int i=0;i<=u;i++)
  47. if(book[i]) ++sum;
  48. printf("0\n%d\n",sum);
  49. return ;
  50. }
  51. void work()
  52. {
  53. for(int i=1;i<=n;i++)
  54. for(int j=0;j<=m;j++)
  55. f[i][j]=-1;
  56. f[0][0]=-1;
  57. for(int i=1;i<=n;i++)
  58. {
  59. bool fg=0;
  60. int ll,rr;
  61. if(book[i]) ll=v[book[i]].l+1,rr=v[book[i]].h-1;
  62. else ll=1,rr=m;
  63. for(int j=ll;j<=rr;j++)
  64. {
  65. if(j==m)
  66. {
  67. for(int k=1;k<=m;k++)
  68. if(f[i-1][k]>=0)
  69. {
  70. fg=1;
  71. if(f[i][j]>=0) f[i][j]=min(f[i][j],f[i-1][k]+(m-k)/x[i-1]+((m-k)%x[i-1]!=0));
  72. else f[i][j]=f[i-1][k]+(m-k)/x[i-1]+((m-k)%x[i-1]!=0);
  73. }
  74. break;
  75. }
  76. if(f[i-1][j+y[i-1]]>=0&&j+y[i-1]<=m) f[i][j]=f[i-1][j+y[i-1]],fg=1;
  77. for(int k=1;k<=j/x[i-1];k++)
  78. {
  79. if(f[i-1][j-k*x[i-1]]>=0&&(j-k*x[i-1])>0)
  80. {
  81. fg=1;
  82. if(f[i][j]>=0) f[i][j]=min(f[i][j],f[i-1][j-k*x[i-1]]+k);
  83. else f[i][j]=f[i-1][j-k*x[i-1]]+k;
  84. }
  85. }
  86. }
  87. if(!fg) { print(i-1); return ;}
  88. }
  89. int t=0;
  90. while(f[n][t]<0) ++t;
  91. int anst=f[n][t];
  92. for(int i=t+1;i<=m;i++)
  93. if(f[n][i]>=0)
  94. anst=min(anst,f[n][i]);
  95. printf("1\n%d\n",anst);
  96. return ;
  97. }
  98. int main()
  99. {
  100. printf("%d\n",sizeof(f)>>20);
  101. freopen("bird.in","r",stdin);
  102. freopen("bird.out","w",stdout);
  103. ans=100005;
  104. n=read(); m=read(); k=read();
  105. for(int i=0;i<n;i++)
  106. x[i]=read(), y[i]=read();
  107. for(int i=1;i<=k;i++)
  108. v[i].p=read(),v[i].l=read(),v[i].h=read();
  109. sort(v+1,v+k+1,cmp);
  110. for(int i=1;i<=k;i++)
  111. book[v[i].p]=i;
  112. if(n<10) { work(); return 0; }
  113. if(v[1].p==0&&k!=0) //50分 改之前: if(v[1].p==0) 20分
  114. {//cout<<"*";
  115. for(int i=v[1].l+1;i<v[1].h;i++)
  116. dfs(0,i,0,0);
  117. }
  118. else
  119. {
  120. for(int i=1;i<=m;i++)
  121. dfs(0,i,0,0);
  122. }
  123. if(flag) printf("1\n%d\n",ans);
  124. else printf("0\n%d\n",sum);
  125. return 0;
  126. }

(考场写法)

80分:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = 100005;
  7. int inf=2147483647;
  8. int n,m,k,f[10005][1005];//f[i][j] 表示到第i步,j高度至少要跳几步
  9. int x[N],y[N],book[N],anst=inf;
  10. struct node{
  11. int p,l,h;
  12. }v[N];
  13. inline int read()
  14. {
  15. int ans=0,w=1;
  16. char c=getchar();
  17. while((c<'0'||c>'9')&&c!='-') c=getchar();
  18. if(c=='-') { w=-1; c=getchar(); }
  19. while(c>='0'&&c<='9')
  20. { ans=ans*10+c-'0'; c=getchar(); }
  21. return ans*w;
  22. }
  23. int min(int a,int b)
  24. { if(a<b) return a; return b; }
  25. int max(int a,int b)
  26. { if(a>b) return a; return b; }
  27. bool cmp(node a,node b)
  28. { return a.p<b.p; }
  29. void print()
  30. {
  31. bool flag=0;
  32. for(int i=1;i<=k;i++)
  33. {
  34. flag=0;
  35. for(int j=1;j<=m;j++)
  36. if(f[v[i].p][j]<inf) { flag=1; break;}
  37. if(!flag) { printf("0\n%d\n",i-1); return ;}
  38. }
  39. }
  40. int main()
  41. {
  42. freopen("bird.in","r",stdin);
  43. freopen("bird.out","w",stdout);
  44. n=read(); m=read(); k=read();
  45. for(int i=0;i<n;i++)
  46. x[i]=read(),y[i]=read();
  47. for(int i=1;i<=k;i++)
  48. v[i].p=read(),v[i].l=read(),v[i].h=read();
  49. sort(v+1,v+k+1,cmp);
  50. for(int i=1;i<=k;i++) book[v[i].p]=i;
  51. memset(f,0x7f,sizeof(f));
  52. inf=f[0][0];
  53. int ll,rr;
  54. if(book[0]) ll=v[book[1]].l+1,rr=v[book[1]].h-1;
  55. else ll=1,rr=m;
  56. for(int i=ll;i<=rr;i++) f[0][i]=0;
  57. for(int i=1;i<=n;i++)
  58. {
  59. if(book[i]) ll=v[book[i]].l+1,rr=v[book[i]].h-1;
  60. else ll=1,rr=m;
  61. for(int j=ll;j<=rr;j++)
  62. {
  63. if(j==m)
  64. {
  65. for(int z=m-x[i-1];z<=m;z++)
  66. {
  67. f[i][j]=min(f[i][j],f[i-1][z]+1);
  68. f[i][j]=min(f[i][j],f[i][z]+1);
  69. }
  70. }
  71. if(j+y[i-1]<=m)
  72. f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);
  73. if(j-x[i-1]>0)
  74. f[i][j]=min(f[i][j],f[i-1][j-x[i-1]]+1),
  75. f[i][j]=min(f[i][j],f[i][j-x[i-1]]+1);
  76. }
  77. }
  78. for(int i=1;i<=m;i++)
  79. anst=min(anst,f[n][i]);
  80. if(anst<inf) printf("1\n%d\n",anst);
  81. else print();
  82. return 0;
  83. }

(题解思路)

luoguP1941-的更多相关文章

  1. luoguP1941福赖皮波德

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  2. 【动态规划】luoguP1941 飞扬的小鸟

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

  3. [luoguP1941] 飞扬的小鸟(DP)

    传送门 动归,用f[i][j]表示到达第I列高度为j时最少需要飞的次数,容易想到最裸的转移: f[i][j]=min(min(f[i-1][j-up[i-1]*k]+k),f[i-1][j+down[ ...

  4. NOIP2018 - 暑期博客整理

    暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...

随机推荐

  1. BZOJ3032 七夕祭

    https://remmina.github.io/BZPRO/JudgeOnline/3032.html 题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ 今年举办了一次线 ...

  2. 【dp】摘花生

    [题目描述] Hello Kitty想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来.地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经 ...

  3. php中的md5()的安全问题

    汇总下php中md5()的安全问题 安全问题1: 1.x=任意字符串  md5('x')=0e*** 2.y=任意字符串  md5('y')=0e*** 如果x==y,php会返回true,在有些时候 ...

  4. bzoj1814 Ural 1519 Formula 1(插头DP)

    对插头DP的理解还不是很透彻. 先说一下肤浅的理解吧. 插头DP使用范围:指数级复杂度,且适用于解决网格图连通性问题,如哈密顿回路等问题.插头一般指每相邻2个网格的接口. 题目难度:一般不可做. 使用 ...

  5. 第五周博客作业<西北师范大学|李晓婷>

    1.助教博客链接:https://home.cnblogs.com/u/lxt-/ 2.作业要求链接:https://www.cnblogs.com/nwnu-daizh/p/10527959.htm ...

  6. 响应式菜单栏: bootstrap + jQuery

    bootstrap库能够很方便的实现PC和移动上的响应式操作. jQuery库大大的简化了脚本的开发: html: <html> <body> <div class='m ...

  7. mysql数据库 删除某几个字段相同的重复记录并根据另一字段留下一条记录

    1.例如Mysql数据库中表a中的记录,id=2,id=6,id=7的记录是重复的(iId,cId等多个字段相同),现在想留下id最小(id=2)或最大(id=7)的一条记录

  8. Collections -- OrderedDict类

    普通dict(字典)在插入的时候并不记住元素的顺序,迭代器会根据散列表(哈希表)中存储的顺序来生成的.而OrderedDict则会记录元素的顺序,并且在迭代器输出时,会按现在记录的顺序进行遍历. 例: ...

  9. RLException: XXX is neither a launch file in package XXX nor is XXX a launch file name问题解决

    在运行roslaunch时出现了类似下面的错误: RLException: XXX is neither a launch file in package XXX nor is XXX a launc ...

  10. git下载/上传文件提示:git did not exit cleanly

    问题:git操作下载/上传文件,提示信息如下 TortoiseGit-git did not exit cleanly (exit code 1) TortoiseGit-git did not ex ...