NOIP2014 飞扬的小鸟
2016-11-07 15:49
260 查看
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是O(nm2)的,很好写。(虽然我写爆了)
转移方程:
dp[i][j]=min(dp[i−1][j+Y[i]],dp[i−1][j−X[i]∗k]+k)
然后实际上这是一个混合背包问题,上升为一个完全背包,下降为01背包,然后直接转移就可以了,复杂度O(nm)。
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是O(nm2)的,很好写。(虽然我写爆了)
转移方程:
dp[i][j]=min(dp[i−1][j+Y[i]],dp[i−1][j−X[i]∗k]+k)
然后实际上这是一个混合背包问题,上升为一个完全背包,下降为01背包,然后直接转移就可以了,复杂度O(nm)。
#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 [i]){ if(ans==-1||dp [i]<ans)ans=dp [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; }
相关文章推荐
- NOIP 2014 飞扬的小鸟
- noip提高组2014 飞扬的小鸟
- NOIP 2014 Day1 T3飞扬的小鸟
- 洛谷 P1941 飞扬的小鸟[NOIP 2014]
- NOIP2014飞扬的小鸟
- NOIP2014 飞扬的小鸟
- 【NOIP2014提高组T3】飞扬的小鸟-完全背包
- NOIP2014飞扬的小鸟[DP][WRONG]
- 【洛谷2439】【NOIP2014】飞扬的小鸟
- NOIP2014 Day1T3 飞扬的小鸟 dp
- Noip2014 Day1 T3 飞扬的小鸟(Dp)
- Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
- NOIP 2014 D1T3 飞扬的小鸟
- [NOIP2014] 飞扬的小鸟
- NOIP2014 飞扬的小鸟
- LuoguP1941[NOIP2014] 飞扬的小鸟 解题报告【背包型DP】
- 【NOIP2014】【洛谷1941】【CJOJ1672】飞扬的小鸟
- Noip 2014 提高组 飞扬的小鸟
- 【NOIP 2014 DAY1 T3】飞扬的小鸟(DP)
- Luogu P1941 [NOIp提高组2014]飞扬的小鸟