先给自己点个蜡
因为自己安排错误导致最后空了20分钟什么都做不了已经凉凉了下次一定把编程留到最后
题意:一个人要穿过沙漠,他的终点距离起点的位置为d,他身上带的水有w。在沙漠中有n个补水站,第i个水站能给他的水的量为si,每次补水会花费这个人相同的金额,同时每1点水能让他行走1KM,问这个人能否到达终点如果能最少补充水的次数是几次。
输入先给出d,w,之后两行第一行是第i个水站距离起点的位置,第二行是第i个水站能提供的水量
一个思路:觉得像很久以前做的一个贪心题目(穿越沙漠)就想歪了。。。。。
自己考完之后想了想这应该是个dp。。。。
首先是简单的数据处理,因为题目并没有给出n的输入所以后头水站的数据需要while(scanf("%d",&l)!=EOF)读入处理
题目问的是最少需要补充几次水才能到达目的地那么我们改一下把题目改成如果要到达目的地那么最开始我们需要带多少水。我们把起点也看成一个水站他的位置为0水量为w
现在水站i的位置p[i],水站i的水量s[i]
我们用min[i]表示从第i个水站补水后出发到达终点的话再到达水站i时身上需要带着的最少水量
我们用ans[i]表示用第i个水站补水后出发到达终点最少需要补水几次
终点起点都可以看成水站, 终点的ans=0,min[i]=0;
然后我们从终点往前推
假设我们要从水站i转移到水站j (i<j),那么必定要满足
pi+si+mini>=pj+minj
所以 mini>=minj+pj-pi-si
而我们当成从水站i出发那么把mini看成0,往后找能够转移的水站j并且选择其中ans最小的进行转移
如果找不到那样的j那么说明从这个点出发mini不能为0那么选择其中使得mini取最小值的j计算mini值和进行转移
这样我们处理到起点时如果min0不等于0那说明我们无法到达目的地