您的位置:首页 > 其它

FZU 1573 大学自习室

2009-07-29 16:00 190 查看
大学自习室

Time Limit:1sMemory limit:32M
Accepted Submit:184Total Submit:645
图书馆终于建成了,可以自习的教室也多了。所以,往常从不自习的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

Original: FOJ月赛-2008年3月

解题:

先知道一半的距离在哪里,再比较各个符合要求的座位哪个离中间比较近。要注意特殊情况的处理。

如:2

EE

0

这也是有结果的。囧

#include <iostream>
using namespace std;

int index(char a[],int n)
{
	int i,j,pos2=0;float half,dist;
	int pos[100];
	half=1.00*(n-1)/2;
	dist=half;
	if (n==2)
	{
		if (a[0]=='E' && a[1]=='E')
		{
			return 0;
		}
	}
	for (i=1,j=0;i<n;i++)
	{
		if (a[i-1]=='E'  && a[i]=='E')
		{
			pos[j]=i-1;
			j++;
			pos[j]=i;
			j++;
		} 
	}
	for (i=0;i<j;i++)
	{
		if (pos[i]<half && half-pos[i]<dist)
		{
			dist=half-pos[i];
			pos2=pos[i];
		} 
		else if(pos[i]>half && pos[i]-half<dist)
		{
			dist=pos[i]-half;
			pos2=pos[i];
		}
		else if (pos[i]==half)
		{
			dist=0;
			pos2=pos[i];
		}
	}
	if(pos2==0)
		return -1;
	else
		return pos2;
}
int main()
{
	int n;
	char a[51];
	while (cin>>n)
	{
		memset(a,'/0',sizeof(a));
		cin>>a;
		cout<<index(a,n)<<endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: