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. git总结二、关于分支上——好好认识下分支是怎么回事

    同样需要先来明确两件事: HEAD指针指向的是当前分支 分支(master, dev)指向的是最新的提交 一开始,git 中只有一个master分支,严格来讲,HEAD不是指向提交而是指向master ...

  2. Java代理模式之Cglib代理

    Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.不鼓励直接使用ASM,因 ...

  3. pycharm failed to create JVM

    启动的时候,出现这个error: 解决办法: 如果电脑安装的jdk是64位,找到pycharm的安装目录下的bin目录下的pycharm64.exe.vmoptions文件修改以下值, 如果是32位, ...

  4. 【UOJ448】【集训队作业2018】人类的本质 min_25筛

    题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...

  5. POJ 3666 Making the Grade (动态规划)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  6. PLSQL 报错弹框乱码

    PLSQL Developer下报错信息显示乱码问题 连接环境:win 7 数据库版本:oracle 11g 模拟一个错误,查看错误提示显示"????"乱码问题,如下: 检查: 1 ...

  7. 一文了解Python的线程

    问题 什么是线程? 如何创建.执行线程? 如何使用线程池ThreadPoolExecutor? 如何避免资源竞争问题? 如何使用Python中线程模块threading提供的常用工具? 目录 1. 什 ...

  8. JAVA之锁-cas

    CAS是什么? CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换.CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B. CAS指令执行时,当且仅当内存地址 ...

  9. 一个Ajax读数据并使用IScroll显示辅助类

    花了2天时间对iscroll进行了一些封装,方便进行ajax读取数据和显示 1.IScroll直接使用的话还是挺麻烦的,特别是牵涉到分页加载动态加载数据时,以下是核心实现代码. 2.Loading提示 ...

  10. 一文说尽MySQL事务及ACID特性的实现原理

    MySQL 事务基础概念 事务(Transaction)是访问和更新数据库的程序执行单元:事务中可能包含一个或多个 sql 语句,这些语句要么都执行,要么都不执行.作为一个关系型数据库,MySQL 支 ...