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" 表示以下的情况:
现在需要你来找出满足Roam要求的座位的编号。
每组数据输入数据的第一行是一个数字N,(1<=N<=50),表示该教室最后一排有N个座位。第二行是一个字符串,表示字符串seat。
如果有多个符合条件的座位,则仅输出其中编号最小的那个;
如果不存在这样的座位,输出-1。
由于Roam找座不是很有经验,而且他还有一些特殊的要求,所以Roam希望你来帮他选择座位。
Roam 对于座位的要求有:
旁边有另一个空座位,可以是左边,也可以是右边(放书包用的...);
为了环境相对稳定,满足要求1的同时,Roam的座位必须是离两边过道最远的;
在教室的最后一排 (-__-!)。
为了使问题更加明确,我们做以下假定:
只考虑教室最后一排中间部分的座位,两边就是过道;
每个座位都有一个编号,若有N(1<=N<=50)个座位,则座位编号从左到右依次为 0,1,2,…,N-1.
输入数据使用一个长度等于座位数的字符串 Seat 表示,字符串中的每一个字符对应一个座位的状态,其中的E(大写字母)表示座位没人,P(大写字母)表示座位已经有人了。
例如:Seat="EPEPEEE" 表示以下的情况:
Empty | People | Empty | People | Empty | Empty | Empty |
0 | 1 | 2 | 3 | 4 | 5 | 6 |
数据输入
输入包括多组数据。每组数据输入数据的第一行是一个数字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]
相关文章推荐
- FOJ 1573 大学自习室
- FOJ 1573 大学自习室
- FOJ--1589--自动机--解题报告
- FOJ 2013 A short problem 解题报告
- foj 1844 题解题报告 + 源代码
- FOJ--1685--跑跑卡丁车--解题报告
- FOJ--1083--Expanding Rods--解题报告
- FOJ--1046--Tempter of the Bone--解题报告(典型的迷宫搜索)
- 2015年秋季大学先修课考试 解题报告
- 湖南工业大学个人选拔赛第一场 解题报告
- 2014年春季大学先修课考试 解题报告
- 2014年秋季大学先修课考试 解题报告
- foj 2170 花生壳的序列 解题报告
- FOJ--1629--Above Average--解题报告
- FOJ--1076--穿越沙漠--解题报告
- FOJ--1409--文件压缩--解题报告
- FOJ--1339--Calculator--解题报告
- ACM-FZUoj2009-1573解题报告
- Hdu 1573 X问题 拓展欧几里得 解题报告
- FOJ--1733--Image Distortion--解题报告