大学自习室
Time Limit:1s | Memory limit:32M |
Accepted Submit:184 | Total Submit:645 |
图书馆终于建成了,可以自习的教室也多了。所以,往常从不自习的Roam也开始上自习了。图书馆的自习室虽然很大而且座位众多,但找到满意座位也确实能算一门学问…… 由于Roam找座不是很有经验,而且他还有一些特殊的要求,所以Roam希望你来帮他选择座位。 Roam 对于座位的要求有:
为了使问题更加明确,我们做以下假定:
例如:Seat="EPEPEEE" 表示以下的情况:
现在需要你来找出满足Roam要求的座位的编号。 数据输入输入包括多组数据。 输出数据对于每组输出数据,输出只有一行,即为你所找到的座位的编号。如果有多个符合条件的座位,则仅输出其中编号最小的那个。
样例输入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; }