NOIP2014 飞扬的小鸟
来源:互联网 发布:战争雷霆数据库 编辑:程序博客网 时间:2024/05/01 13:13
NOIP2014 飞扬的小鸟
Description
Input
Output
输出文件名为 bird.out。
共两行。
第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0。
第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数,否则,输出小鸟最多可以通过多少个管道缝隙。
Sample Input
Hint
【输入输出样例说明】
如下图所示,蓝色直线表示小鸟的飞行轨迹,红色直线表示管道。
对于 30%的数据:
5≤n≤10,5≤m≤10,k=0 ,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次;对于 50%的数据:
5≤n≤20,5≤m≤10 ,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次;对于 70%的数据:
5≤n≤1000,5≤m≤100 ;对于 100%的数据:
5≤n≤10000,5≤m≤1000,0≤k<n,0<X<m,0<Y<m,0<P<n,0≤L<H≤m,L+1<H 。
Solution:
70分的dp是虽然我写爆了)
转移方程:
然后实际上这是一个混合背包问题,上升为一个完全背包,下降为01背包,然后直接转移就可以了,复杂度
#include<ctime>#include<cstdio>#include<cctype>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<set>#include<map>#include<queue>#include<vector>#include<string>#define lson (p<<1)#define rson (p<<1|1)#define ll long long#define siz(x) ((x).size())#define lowbit(x) ((x)&(-x))using namespace std;inline void Rd(int &res){ char c;res=0; while(c=getchar(),c<'0'); do{ res=(res<<1)+(res<<3)+(c^48); }while(c=getchar(),c>='0');}const int M=10005;int X[M],Y[M],n,m,k,L[M],H[M],pos[M];int dp[M][1005];struct P100{ void solve(){ memset(dp,-1,sizeof(dp)); for(int i=1;i<=m;i++)dp[0][i]=0; for(int i=0;i<n;i++){ for(int j=L[i]+1;j<=m;j++){ if(~dp[i+1][j]){ int pos=j+X[i]; if(pos>m)pos=m; if(dp[i+1][pos]==-1||dp[i+1][j]+1<dp[i+1][pos])dp[i+1][pos]=dp[i+1][j]+1; } if(j<H[i]&&~dp[i][j]){ int pos=j+X[i]; if(pos>m)pos=m; if(dp[i+1][pos]==-1||dp[i][j]+1<dp[i+1][pos])dp[i+1][pos]=dp[i][j]+1; } } for(int j=H[i]-1;j>L[i]&&j>Y[i];j--) if(~dp[i][j]){ if(dp[i+1][j-Y[i]]==-1||dp[i][j]<dp[i+1][j-Y[i]])dp[i+1][j-Y[i]]=dp[i][j]; } } int ans=-1; for(int i=1;i<=m;i++) if(~dp[n][i]){ if(ans==-1||dp[n][i]<ans)ans=dp[n][i]; } if(~ans){ printf("1\n%d\n",ans); }else{ for(int i=1;i<=k;i++){ bool flag=false; for(int j=L[pos[i]]+1;j<H[pos[i]];j++) if(~dp[pos[i]][j])flag=true; if(!flag){ printf("0\n%d\n",i-1); return; } } } }}P100;int main(){//ll memory freopen %P// freopen("bird.in","r",stdin);// freopen("bird.out","w",stdout); Rd(n),Rd(m),Rd(k); for(int i=0;i<n;i++)Rd(X[i]),Rd(Y[i]); for(int i=0;i<=n;i++)L[i]=0,H[i]=m+1; for(int i=1;i<=k;i++){ int l,h; Rd(pos[i]),Rd(l),Rd(h); L[pos[i]]=l,H[pos[i]]=h; } sort(pos+1,pos+k+1); P100.solve(); return 0;}
1 0
- NOIP2014 飞扬的小鸟
- NOIP2014飞扬的小鸟
- NOIP2014飞扬的小鸟
- NOIP2014 飞扬的小鸟
- noip2014飞扬的小鸟
- 【NOIP2014】飞扬的小鸟
- noip2014飞扬的小鸟
- 飞扬的小鸟 noip2014
- NOIP2014 飞扬的小鸟
- [NOIP2014]飞扬的小鸟
- [NOIP2014] 飞扬的小鸟
- 【NOIP2014】飞扬的小鸟
- NOIP2014:飞扬的小鸟
- NOIP2014 飞扬的小鸟
- [NOIP2014]飞扬的小鸟
- NOIP2014飞扬的小鸟
- 【NOIP2014】飞扬的小鸟题解
- NOIP2014 D1T3飞扬的小鸟
- C++复制构造函数应用场景
- Android-->RecyclerView 显示底部,滚动底部(无动画)
- 王朝 第十一周 英雄联盟
- 自考总结
- MyEclipse:Errors running builder 'DeploymentBuilder' on project '工程名'
- NOIP2014 飞扬的小鸟
- Krylov subspace
- ImageView显示视频的第一帧图片&&VideoView视频播放
- 剑指Offer——知识点储备-设计模式
- Python入门:文件内容去重操作
- DBWR 3个触发条件详细解释
- 如何创建属于你自己的域名邮箱
- Retrofit注解
- !=与 <> sql语句的区别