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;
}