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. React Native & Android & iOS & APK

    React Native & Android & iOS & APK https://play.google.com/apps/publish/signup/ $ 25 bui ...

  2. Django内置分页

    一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...

  3. Jetson TX1使用usb camera采集图像 (2)

    该方法只启动usb摄像头 import cv2 import numpy import matplotlib.pyplot as plot class Camera: cap = cv2.VideoC ...

  4. 高斯消元part2

    今天整一整高斯消元的模板,正经的 高斯消元主要用于解n元一次线性方程组与判断是否有解 主要思想? 就是高斯消元啊 主要思想是理想状态下消为每行除最后一项外只有一个1,并且每行位置互异,具体看下面. 这 ...

  5. node 全局对象global —— 记录在线人员

    最近做毕设的时候,在做查看在线人员这个功能的时候,一直卡顿,我的思路是数据库保存 是否在线 字段,可以在登录时和退出系统修改状态,但如果用户之间关闭窗口时候就没办法向后台发出修改在线状态的请求.我想到 ...

  6. wx.request 使用数据

    小程序中,怎么使用wx.request返回的数据??? 在你的js页面中 主要是这句话 var that=this; 为什么呢?因为使用过jquery的ajax的朋友都知道.在ajax函数中的this ...

  7. Java技术栈思维导图

    Java技术栈思维导图 Java IO流体系 设计模式

  8. JAVA helloworld!

    idea创建java项目 https://jingyan.baidu.com/article/48b558e3f8f6637f39c09a44.html 本地文档运行 java helloworld ...

  9. 浅谈Kubernetes生产架构

    注意本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计和实现方案的总结,内容很粗糙,同时也会不断完善. 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下 ...

  10. blackbox_exporter介绍

    Blackbox Exporter是Prometheus社区提供的官方黑盒监控解决方案,其允许用户通过:HTTP.HTTPS.DNS.TCP以及ICMP的方式对网络进行探测. 1.安装部署 cd /u ...