【普及模拟】最小步数(steps.pas)//2018.1.31
2018-01-31 20:37
211 查看
题目
题目描述从起点到终点有N步,如果“走”第K步,将会得到A[K]元钱,A[K]可能为负数。
你也可以花100元钱“跳过”当前的这一步,即不会得到A[K]。但是任何时刻身上的钱都必须是非负的。开始时,你身上共有0元。给定数组A,求在能到达终点的情况下最小需要走过(即不是用100元钱跳过)的步数。注意:最后一步必须走,不能选择跳过。
输入
共有两行。
第一行为整数N(0<=N<=100)。
第二行有N个整数,第K个数为A[K],-10000<=A[K]<=10000。
输出
一个整数,表示需要走的最少步数。若无法走到终点,输出-1。
解题思路
用模拟最多能对7个点,正解是用动态规划做,开两个数组,分别为ff[i][j](前i个点走j步时的花费),和f[i][j](前i个点跳了j步时的花费)
代码
#include<cstdio> #include<iostream> using namespace std; int n,a[110],ans,f[110][110],ff[110][110]; int main() { //freopen("steps.in","r",stdin); //freopen("steps.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) for (int j=0;j<=i;j++) f[i][j]=ff[i][j]=-214748364; //初始化 for (int i=1;i<=n;i++) for (int j=1;j<=i;j++) { int tt=max(f[i-1][j],ff[i-1][j]); if (tt>=100&&i!=n) f[i][j]=tt-100; tt=max(f[i-1][j-1],ff[i-1][j-1]); if (tt+a[i]>=0) ff[i][j]=tt+a[i];【也可以用三维做】 } for (int i=1;i<=n;i++) if (ff [i]>=0) {printf("%d",i); return 0;} //有一个满足条件,就输出 printf("-1"); }
相关文章推荐
- 【普及模拟】奇数统计(count.pas/cpp)//2018.1.31
- 【普及模拟】活动安排(meet.pas)//2018.1.31
- JZOJsenior2016.2017.04.08【NOIP 普及组】模拟赛C组 T2最小步数
- jzoj 1730. 【10.5NOIP普及模拟】sort(sort.pas/cpp)
- jzoj 1731. 【10.5NOIP普及模拟】sum(sum.pas/cpp)
- JZOJ(中山纪中) 1591. 【普及模拟】游戏(j5.pas/cpp)
- 【2014.8.17NOIP普及组模拟】【高精度乘法】公牛数学(bullmath.pas/c/cpp) //2018.2.2
- Jump Game II 到达终点的最小步数 模拟
- OIBH杯第三次普及组模拟赛T2 最小花费
- 【重走普及路】【模拟】铺地毯
- 【普及模拟】单元格(jzoj)(恶心)
- 2062. 【2016.10.4NOIP普及模拟】Bill
- 【2016.10.6NOIP普及模拟】Pond
- nyoj 58 最小步数
- 【模拟】贾老二的工件 jia.pas/c/cpp
- 【队列模拟】集卡片 card.pas/c/cpp
- hdu_1257_贪心_模拟_最小拦截系统
- NYOJ 题目58 最小步数
- [面试题] 5,7,12通过加减得到n,求最小步数(特点是5+7=12)
- NYOJ 题目58最小步数