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. Base 64 & decodeURIComponent

    Base 64 & decodeURIComponent js btoa() & atob() let obj = [{"key":"q",&q ...

  2. P4137 Rmq Problem / mex (莫队)

    题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...

  3. docker基本使用

    1.启动执行一次的容器 2.启动交互式容器 -i:告诉docker守护进程始终打开交互输入 -t:给容器分配一个伪tty终端 3.查看容器 docker ps:查看正在运行的容器 docker ps ...

  4. vue 中的通过搜索框进行数据过滤的过程

    <template> <div> <input type="text" v-model="searchId" placeholde ...

  5. MapReduce-TextInputFormat 切片机制

    MapReduce 默认使用 TextInputFormat 进行切片,其机制如下 (1)简单地按照文件的内容长度进行切片 (2)切片大小,默认等于Block大小,可单独设置 (3)切片时不考虑数据集 ...

  6. Dynamics CRM - 使用 C# Plugin 调用 SQL 存储过程

    有时候,在 Dynamics CRM Plugin 中通过 linq 查询数据会比较慢,可以通过采用在 C# plugin 中直接调用数据库存储过程的方式来提高效率,具体过程如下: 1.新建一个存储过 ...

  7. Java虚拟机—垃圾收集器(整理版)

    1.概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很 ...

  8. Python——将高德坐标(GCJ02)转换为GPS(WGS84)坐标

    # 官方API: http://lbs.amap.com/api/webservice/guide/api/convert # 坐标体系说明:http://lbs.amap.com/faq/top/c ...

  9. 认识Modbus协议

    1.什么是Modbus? Modbus协议是应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间,控制器经由网络(例如以太网)和其它设备之间可以通信.Modbus协议定义了一个控制器能认识使用 ...

  10. smbclient匿名访问win7共享文件夹

    windows: 首先需要开启Guest用户,设置密码为空. 然后需要在管理工具下的本地安全策略中检查本地策略\用户权限分配\拒绝从网络访问这台计算机如果有Guest或Guests则删掉. 然后正常共 ...