luoguP1941-

20分&50分:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 20005;
int n,m,k,x[N],y[N],ans,sum,book[N];
int f[10005][1005];
struct node{
int p,l,h;
}v[N];
bool flag;
inline int read()
{
int ans=0,w=1;
char c=getchar();
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') { w=-1; c=getchar(); }
while(c>='0'&&c<='9')
{ ans=ans*10+c-'0'; c=getchar(); }
return ans*w;
}
int min(int a,int b)
{ if(a<b) return a; return b; }
int max(int a,int b)
{ if(a>b) return a; return b; }
bool cmp(node a,node b)
{ return a.p<b.p; }
void dfs(int t,int high,int ansp,int sumt)
{
high=min(high,m);
if(ansp>ans) return ;
if(high<=0) return ;
if(book[t])
{ if(high>=v[book[t]].h||high<=v[book[t]].l) return ; }
if(t>=n) { flag=1; ans=min(ans,ansp); return ;}
if(book[t]) ++sumt;
sum=max(sum,sumt);
dfs(t+1,high-y[t],ansp,sumt);
for(int i=1;i<=3;i++)
dfs(t+1,high+i*x[t],ansp+i,sumt);
}
void print(int u)
{
int sum=0;
for(int i=0;i<=u;i++)
if(book[i]) ++sum;
printf("0\n%d\n",sum);
return ;
}
void work()
{
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
f[i][j]=-1;
f[0][0]=-1;
for(int i=1;i<=n;i++)
{
bool fg=0;
int ll,rr;
if(book[i]) ll=v[book[i]].l+1,rr=v[book[i]].h-1;
else ll=1,rr=m;
for(int j=ll;j<=rr;j++)
{
if(j==m)
{
for(int k=1;k<=m;k++)
if(f[i-1][k]>=0)
{
fg=1;
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));
else f[i][j]=f[i-1][k]+(m-k)/x[i-1]+((m-k)%x[i-1]!=0);
}
break;
}
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;
for(int k=1;k<=j/x[i-1];k++)
{
if(f[i-1][j-k*x[i-1]]>=0&&(j-k*x[i-1])>0)
{
fg=1;
if(f[i][j]>=0) f[i][j]=min(f[i][j],f[i-1][j-k*x[i-1]]+k);
else f[i][j]=f[i-1][j-k*x[i-1]]+k;
}
}
}
if(!fg) { print(i-1); return ;}
}
int t=0;
while(f[n][t]<0) ++t;
int anst=f[n][t];
for(int i=t+1;i<=m;i++)
if(f[n][i]>=0)
anst=min(anst,f[n][i]);
printf("1\n%d\n",anst);
return ;
}
int main()
{
printf("%d\n",sizeof(f)>>20);
freopen("bird.in","r",stdin);
freopen("bird.out","w",stdout);
ans=100005;
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++)
v[i].p=read(),v[i].l=read(),v[i].h=read();
sort(v+1,v+k+1,cmp);
for(int i=1;i<=k;i++)
book[v[i].p]=i;
if(n<10) { work(); return 0; }
if(v[1].p==0&&k!=0) //50分 改之前: if(v[1].p==0) 20分
{//cout<<"*";
for(int i=v[1].l+1;i<v[1].h;i++)
dfs(0,i,0,0);
}
else
{
for(int i=1;i<=m;i++)
dfs(0,i,0,0);
}
if(flag) printf("1\n%d\n",ans);
else printf("0\n%d\n",sum);
return 0;
}

(考场写法)

80分:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100005;
int inf=2147483647;
int n,m,k,f[10005][1005];//f[i][j] 表示到第i步,j高度至少要跳几步
int x[N],y[N],book[N],anst=inf;
struct node{
int p,l,h;
}v[N];
inline int read()
{
int ans=0,w=1;
char c=getchar();
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') { w=-1; c=getchar(); }
while(c>='0'&&c<='9')
{ ans=ans*10+c-'0'; c=getchar(); }
return ans*w;
}
int min(int a,int b)
{ if(a<b) return a; return b; }
int max(int a,int b)
{ if(a>b) return a; return b; }
bool cmp(node a,node b)
{ return a.p<b.p; }
void print()
{
bool flag=0;
for(int i=1;i<=k;i++)
{
flag=0;
for(int j=1;j<=m;j++)
if(f[v[i].p][j]<inf) { flag=1; break;}
if(!flag) { printf("0\n%d\n",i-1); return ;}
}
}
int main()
{
freopen("bird.in","r",stdin);
freopen("bird.out","w",stdout);
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++)
v[i].p=read(),v[i].l=read(),v[i].h=read();
sort(v+1,v+k+1,cmp);
for(int i=1;i<=k;i++) book[v[i].p]=i;
memset(f,0x7f,sizeof(f));
inf=f[0][0];
int ll,rr;
if(book[0]) ll=v[book[1]].l+1,rr=v[book[1]].h-1;
else ll=1,rr=m;
for(int i=ll;i<=rr;i++) f[0][i]=0;
for(int i=1;i<=n;i++)
{
if(book[i]) ll=v[book[i]].l+1,rr=v[book[i]].h-1;
else ll=1,rr=m;
for(int j=ll;j<=rr;j++)
{
if(j==m)
{
for(int z=m-x[i-1];z<=m;z++)
{
f[i][j]=min(f[i][j],f[i-1][z]+1);
f[i][j]=min(f[i][j],f[i][z]+1);
}
}
if(j+y[i-1]<=m)
f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);
if(j-x[i-1]>0)
f[i][j]=min(f[i][j],f[i-1][j-x[i-1]]+1),
f[i][j]=min(f[i][j],f[i][j-x[i-1]]+1);
}
}
for(int i=1;i<=m;i++)
anst=min(anst,f[n][i]);
if(anst<inf) printf("1\n%d\n",anst);
else print();
return 0;
}

(题解思路)

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. canvas学习笔记,实用知识点总结(上)

    本博客是本人日常学习笔记,作为重要知识点的总结记录,随笔风格可能更倾向于个人的学习习惯和方式,若对您有帮助十分荣幸,若存在问题欢迎互相学习探讨,前端小白一枚在此恭候. 一.基本使用规则 1.创建画布 ...

  2. codevs 2370 小机房的树(LCA)

    过了这么长的时间终于开始看LCA了... 有一次训练题卡在LCA当时不会...拖了好久好久...其实现在还是不会... 只会tarjan... 传送门 板子题咯 tarjan的算法就是基于先序遍历的顺 ...

  3. xgboost 非官方每天编译

    xgboost  http://ssl.picnet.com.au/xgboost/ 非官方每天编译

  4. Vue应用请求SpringBoot API出现 CORS 跨域请求设置 Invalid CORS request错误

    1.全局配置 在application.java文件添加CorsRegistry配置 package com.ypnh.authority; import com.ypnh.authority.inf ...

  5. Go中的iota

    当时在学习Iota这个知识点的时候仅仅是一笔掠过,比如这种 const( a=iota b c ) 一眼看出他怎么使用的时候就觉得自己已经懂得了 再到后来看到这样的例子 const( a = 5*io ...

  6. shell-计算虚拟机创建时间

    因为要验证虚拟机创建时间,所以写了下面一个脚本 #!/bin/bash ################################################################ ...

  7. echarts Map(地图) 不同颜色区块显示

    以河南地图为例: 代码如下: <h3>天翼日必达完成率</h3> <div id="map" style="height:340px; te ...

  8. windows类似grep的命令——findstr

    windows类似grep的命令——findstr   使用Chrome发现访问google总是向香港那边跳转,估计配置文件中google网站映射的地址是www.google.com.hk,便想着改配 ...

  9. Docker 基本核心原理

    Docker内核知识 namespace资源隔离 namespace的6项隔离 NameSpace 系统调用参数 隔离内容 UTS CLONE_NEWUTS 主机名与域名 IPC CLONE_NEWI ...

  10. Docker安装rabbitmq

    前面的文章中我们的docker已经安装好了,我的最终目的是用docker来安装rabbitmq,所以本文我记录一下我用docker安装rabbitmq的过程: 1.下载镜像(下载management的 ...