uva 11157 Dynamic Frog (贪心)
uva 11157 Dynamic Frog (贪心)
题目大义:一直青蛙跳过去再跳回来,路程中有大石头,小石头,小石头跳一下就掉下去了,大石头不会掉下去。问你来回的路程中,最大的一次跳跃距离多大?
解题思路:转换下题意,想象成两只青蛙同时往对岸跳,过程中有大石头能供两只青蛙同时站立,小石头只能被一只青蛙站立就掉下去,问两只青蛙最大的一次跳跃距离多大?
这个题意与题目是等价的,所以答案也相同。具体解法就是:
(1)遇到大石头,两只青蛙同时跳到这个位置
(2)遇到大石头之间的小石头,两只青蛙轮流使用站在小石头,若这个石头A青蛙跳,下个石头就得B青蛙跳,这样才能使最大跳跃最小(这个需要思考一下)。
(3)更新过程中每次的跳跃距离,更新出最大的距离即答案
(4)两岸(起点,终点)都可以看成大石头,可供两只青蛙站立。
代码如下:
/********************* uva 11157 Dynamic frog Accepted by tao_wang on 2013/3/8 using 0.012s **********************/ #include <iostream> #include <cstdio> #include <vector> using namespace std; const int maxn=110; struct stone{ int cnt; int w; stone(char ch=' ',int w0=0){ if(ch=='S') cnt=1; else cnt=maxn; w=w0; } }; int n,l,ans; vector <stone> v; void initial(){ v.clear(); ans=0; } void input(){ scanf("%d%d",&n,&l); v.push_back(stone('B',0)); char ch1,ch2; int tmp; for(int i=0;i<n;i++){ cin>>ch1>>ch2>>tmp; v.push_back(stone(ch1,tmp)); } v.push_back(stone('B',l)); } void computing(){ int pre1=0,now1=0; int pre2=0,now2=0; for(int i=0;i<v.size();i++){ if(v[i].cnt>1){ now1=v[i].w; now2=v[i].w; if(now1-pre1>ans) ans=now1-pre1; if(now2-pre2>ans) ans=now2-pre2; pre1=now1; pre2=now2; } else{ if(pre2>pre1){ now1=v[i].w; if(now1-pre1>ans) ans=now1-pre1; pre1=now1; } else{ now2=v[i].w; if(now2-pre2>ans) ans=now2-pre2; pre2=now2; } } } } void output(){ printf("%d\n",ans); } int main(){ int casen; scanf("%d",&casen); for(int i=1;i<=casen;i++){ initial(); input(); computing(); printf("Case %d: ",i); output(); } return 0; }