USACO 2016 JANUARY CONTEST, BRONZE PROBLEM 3. MOWING THE FIELD(收割庄稼)

来源:互联网 发布:岸谷新罗知乎 编辑:程序博客网 时间:2024/06/10 04:00
石门实验中学 卢凯宾/
Farmer John 在管理他的农场方面是很可靠的,除了一个1方面:他在及时地割草或合乎逻辑地割草方面很糟糕。(你问我啥意思?_?译者也是一头雾水的说)
农场是一个由正方形小格子组成的大型二维网格。 FJ 在时刻t ? 0 从这些小格子的其中一个出发,顺便把出发点中的草给割了,那么最初被收割的草方格只有一个2。接下来 FJ 的收割过程由一个长度为 N 的序列描述。例如,如果第一个状态是“W 10”,那么从时刻t ? 1t ? 10(也就是接下来的 10 个时间单位),FJ 会走一个格子3到他的西边4,并收割沿途的草。在他完成这一系列行动之后,他会在t ? 10 时刻在距原点西边 10 个格子的地方停下来,并完成对一路上所有格子的草的收割。
FJ 的收割速度慢得花儿都谢了,以致有些他割过的草可能在他完成收割前重新长了出来。注意,每株在时刻t 被收割的草会在时刻t ? x 复活。
FJ 这奇葩的收割方式搞不好要让他对同一个点收割好几次,然而机智的他却注意到,他从没有碰到过一个已经收割好还没重新长出来的草格子。即:每次他到达一个格子的时候,他上一次到这个格子最少也是在 x 个时间单位之前了, 机智的他这样安排是为了让调皮的草重新长出来,然后再次被他残忍的收割=_=
显然,对于机智的你,求出 x 的最大可能值不过是举手之劳,那就轻轻松松编个程序算下咯。
输入格式 (文件名 mowing.in):
输入数据的第一行只有一个正整数 N?1 ? N ? 100?。 接下来的 N 行, 每行的格式形如“ D S” ,
其中 D 描述了方向(N North 北,E East 东,S South 南,W West 西),至S 则是照这个方向所走的距离?1 ? S ? 10?
输出格式 (文件名 mowing.out):
输出 x 的最大值。若 FJ 从未多次到达同一格子则输出-1
1 这儿的“一个”方面是单数,跟后面的两个方面不一致,但原文是如此——译者注
2 也就是出发点这个格子。——译者注
3 每个时刻都走一格,即一共是走了 10 格的。——译者注
4 这里是按照原文“FJ will step one cell to his west”直译,可理解为“往西走一格”。——译者注
样例输入:
6N
10
E 2
S 3
W 4
S 5
E 8
样例输出:
10
样例解释:
在这个例子中,FJ 在时刻 17 所处的格子正是他在时刻 7 所处的格子;因此, x 一定最多10,否则他第一次割掉的草还不够时间重新长出来。他在时刻 26 所处的格子也正是他在时刻 2 所处的格子;因此 x 也不可能超过 24。综合两个条件,易知 x 最多可以是 10

================================================================
题目大意:给出FJ的操作序列,问FJ最多两次访问一个格的差距?注意数据范围足够小,我们可以直接模拟FJ的移动,并用二维数组模拟整个草场,记录FJ最后一次到达某个点的时间(打时间戳)。如果走到某一个点的时候发现之前已经来过了,就计算时间差,取所有时间差的最小值即可。时间复杂度为O(N*S),空间复杂度为O((N*S)^2)。

#include<fstream>
using namespace std;
const int maxn=105;
const int maxs=15;
ifstream fin("mowing.in");
ofstream fout("mowing.out");
int dx[256],dy[256],n,field[maxn*maxs][maxn*maxs];
int main(){
dx['N']=-1; dx['E']=0; dx['S']=1; dx['W']=0;
dy['N']=0; dy['E']=1; dy['S']=0; dy['W']=-1;
fin>>n;
int ans=2147483647,x=1001,y=1001,t=1;// field[x][y]=0;
for(int i=0;i!=n;++i){
char d;
int s;
fin>>d>>s;
for(int j=0;j!=s;++j){
x+=dx[d]; y+=dy[d];
if(field[x][y]||x==1001&&y==1001)ans=min(ans,t+j-field[x][y]);
field[x][y]=t+j;
}
t+=s;
}
//fout<<ans<<endl;
fout<<(ans==2147483647?-1:ans)<<endl;
return 0;
}

0 0
原创粉丝点击