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