codeforces G. Snow Boots(动态规划)

G. Snow Boots

time limit per test:1 second
memory limit per test:256 megabytes
input:standard input
output:standard output

It’s winter on the farm, and that means snow! There are N tiles on the path from the farmhouse to the barn, conveniently numbered 1…N, and tile i is covered in fi feet of snow.
Farmer John starts off on tile 1 and must reach tile N to wake up the cows. Tile 1 is sheltered by the farmhouse roof, and tile N is sheltered by the barn roof, so neither of these tiles has any snow. But to step on the other tiles, Farmer John needs to wear boots!
In his foul-weather backpack, Farmer John has B pairs of boots, numbered 1…B. Some pairs are more heavy-duty than others, and some pairs are more agile than others. In particular, pair i lets FJ step in snow at most si feet deep, and lets FJ move at most di forward in each step.
Unfortunately, the boots are packed in such a way that Farmer John can only access the topmost pair at any given time. So at any time, Farmer John can either put on the topmost pair of boots (discarding his old pair) or discard the topmost pair of boots (making a new pair of boots accessible).
Farmer John can only change boots while standing on a tile. If that tile has f feet of snow, both the boots he takes off AND the boots he puts on must be able to withstand at least f feet of snow. Intermediate pairs of boots which he discards without wearing do not need to satisfy this restriction.
Help Farmer John minimize waste, by determining the minimum number of pairs of boots he needs to discard in order to reach the barn. You may assume that Farmer John is initially not wearing any boots.

Input

The first line contains two space-separated integers N and B (2 ≤ N,B ≤ 250).
The second line contains N space-separated integers. The ith integer is fi, giving the depth of snow on tile i (0 ≤ fi ≤ 109). It’s guaranteed that f1 = fN = 0.
The next B lines contain two space-separated integers each. The first integer on line i + 2 is si, the maximum depth of snow in which pair i can step. The second integer on line i + 2 is di, the maximum step size for pair i. It’s guaranteed that 0 ≤ si ≤ 109 and 1 ≤ di ≤ N −1.
The boots are described in top-to-bottom order, so pair 1 is the topmost pair in FJ’s backpack, and so forth.

Output

The output should consist of a single integer, giving the minimum number of boots Farmer John needs to discard. It’s guaranteed that it will be possible for FJ to make it to the barn.

Example

Input
10 4
0 2 8 3 6 7 5 1 4 0
2 3
4 2
3 4
7 1
Output
2

分析

题意:FJ需要从农舍跑到谷仓。去谷仓的路由N个瓷砖组成,按1-N编号,FJ从瓷砖1出发到瓷砖N,就可以到达谷仓了。因为大雪,瓷砖被不同厚度的的雪覆盖。FJ的恶劣天气应对背包里有B双靴子,按1-B编号。靴子的最大涉雪深度各不相同,而且靴子每步最大可行进距离也有所相异;因为背包的性质,你每次只能拿最顶上的一双靴子,而且要拿下面的靴子就只能把上面的靴子奢侈地扔掉,并且换上的靴子的可涉雪深度也必须不能比雪的深度小
问丢弃靴子的最小数量;

明显的动态规划,然而当时想都不想就写了贪心。还是对于这种题目没有很好的感觉。一双涉雪很小但跨步很大的鞋子就可以把贪心方法给干掉。

可以记录正在穿第几双鞋,然后慢慢扫下去扫出最小值;
也可以记录前几双鞋可以到达的位置,一旦到达终点立刻结束,当前使用的靴子的标号减一就是最小丢弃量;
能想到是动态规划就很容易了。

代码

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
#define MS(X) memset(X,0,sizeof(X))
#define MSC(X) memset(X,-1,sizeof(X))
typedef long long LL;
using namespace std;
int f[255],s[255],d[255],dp[255];
int main(){
    int n,b,i;
    MS(dp);
    scanf("%d%d",&n,&b);
    for(i=1;i<=n;i++) scanf("%d",&f[i]);
    for(i=1;i<=b;i++) scanf("%d%d",&s[i],&d[i]);
    dp[1]=1;
    for(i=1;i<=b;i++){
        for(int j=1;j<=n;j++){
            if(dp[j]&&s[i]>=f[j]){
                for(int k=j;k<=min(j+d[i],n);k++){
                    if(s[i]>=f[k]) dp[k]=1;
                }
            }
        }
        if(dp[n]==1) break;
    }
    printf("%d\n",i-1);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值