您的位置:首页 > 其它

FOJ--1573--大学自习室--解题报告

2009-08-04 13:11 218 查看
图书馆终于建成了,可以自习的教室也多了。所以,往常从不自习的Roam也开始上自习了。图书馆的自习室虽然很大而且座位众多,但找到满意座位也确实能算一门学问……

由于Roam找座不是很有经验,而且他还有一些特殊的要求,所以Roam希望你来帮他选择座位。

Roam 对于座位的要求有:

旁边有另一个空座位,可以是左边,也可以是右边(放书包用的...);

为了环境相对稳定,满足要求1的同时,Roam的座位必须是离两边过道最远的;

在教室的最后一排 (-__-!)。

为了使问题更加明确,我们做以下假定:

只考虑教室最后一排中间部分的座位,两边就是过道;

每个座位都有一个编号,若有N(1<=N<=50)个座位,则座位编号从左到右依次为 0,1,2,…,N-1.

输入数据使用一个长度等于座位数的字符串 Seat 表示,字符串中的每一个字符对应一个座位的状态,其中的E(大写字母)表示座位没人,P(大写字母)表示座位已经有人了。

例如:Seat="EPEPEEE" 表示以下的情况:

EmptyPeopleEmptyPeopleEmptyEmptyEmpty
0123456
现在需要你来找出满足Roam要求的座位的编号。

数据输入

输入包括多组数据。
每组数据输入数据的第一行是一个数字N,(1<=N<=50),表示该教室最后一排有N个座位。第二行是一个字符串,表示字符串seat。

输出数据

对于每组输出数据,输出只有一行,即为你所找到的座位的编号。如果有多个符合条件的座位,则仅输出其中编号最小的那个。

如果有多个符合条件的座位,则仅输出其中编号最小的那个;

如果不存在这样的座位,输出-1。

样例输入

7
EPEPEEE
6
PEPPEP

样例输出

4
-1

解法一:这题我WA了好几次,实在是不知道自己哪错了,郁闷啊

我是从第一个位置开始找,把找到适合的都记下,最后找出编号最小的

下面是我WA的代码:

#include <string>
#include <map>
using namespace std;
int main()
{
int n,i,max_len,num;
char a[51];
map<int,bool> b;
while (scanf("%d",&n)!=EOF)
{
getchar();
for(i=0;i<n;i++)
scanf("%c",&a[i]);
getchar();
for(i=0;i<n;i++)
{
if(a[i]=='E')
{
if(i==0)
{
if(n==1)
b[i]=true;
else
{
if(a[i+1]=='E')
b[i]=true;
else
b[i]=false;
}

}
else if(i==n-1)
{
if(a[i-1]=='E')
b[i]=true;
else
b[i]=false;
}
else
{
if(a[i-1]=='E'  || a[i+1]=='E')
{
b[i]=true;
}
else
b[i]=false;
}

}
else
b[i]=false;
}
max_len=-1;
num=-1;
for(i=0;i<n;i++)
{
if(b[i])
{
if(i<(n+1)/2 && max_len<i)
{
max_len=i;
num=i;
}
else if(i>=(n+1)/2 && max_len<n-1-i)
{
max_len=n-i;
num=i;
}
}
}
printf("%d/n",num);
}
return 0;
}
[/code]
不知道我这样想有没有错,测了很多数据都会对

解法二:最后找到了一个正解,这种解法是从中间开始向2边搜索,搜到就输出这个位置的编号,搜索也就结束了

代码如下:

#include <stdio.h>
int main()
{
int n;
char set[55];
int i,j,k,l;
while(scanf("%d",&n)!=EOF)
{
k=0;
i=0;
j=0;
scanf("%s",set);
l=n-n/2-1;
for(i=l,j=l;i>=0,j<n;i--,j++)
{
if(set[i]=='E'&&set[i-1]=='E')
{
k=1;
break;
}
if(set[j]=='E'&&set[j+1]=='E')
{
k=2;
break;
}
}
if(k==0)
printf("-1/n");
if(k==1)
printf("%d/n",i);
if(k==2)
printf("%d/n",j);
}
return 0;
}
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: