题意是说,有位老师,想当个能叫出所有学生名字的好老师,可是学生太多,有些学生的名字还是叫不出来。为了不让学生看出来,如果要点名那个叫不出名字的同学,就采取就近原则,找到最近的已知名字的同学X,然后喊left of X或者right of X来代替,如果该同学正好位于X和Y的中间,则喊“middle of X andY”
举了个例子,以下是学生的位置信息,从左往右按1,2,3,4。。。顺序标号,那么对应位置的同学的称呼如下:
A ? ? D ? ? ? H ? ?
题目很简单,如果给定的学生名字是问号,那么只是需要判定他的左边和右边是否有已知名字的同学,并根据距离远近来决定用“left of ”还是“right of” 还是"middle of "
python版本代码如下
n = int(input())
namelist = input().split()
name = ['studentname']
know = [0]
for i in range(len(namelist)):
name.append(namelist[i])
if namelist[i][0] =='?':
know.append(0)
else:
know.append(1)
q = int(input())
while q > 0:
q -= 1
ans = ""
p = int(input())
if know[p] == 1:
print(name[p])
else:
j = p
while j >= 1 and know[j] == 0:
j -= 1
a = j
j = p
while j <= n and know[j] == 0:
j += 1
b = j
if a < 1:
for _ in range(b-p):
ans += "left of "
ans += name[b]
print(ans)
elif b > n:
for _ in range(p-a):
ans += "right of "
ans += name[a]
print(ans)
else:
if p-a < b-p:
for _ in range(p-a):
ans += "right of "
ans += name[a]
print(ans)
elif p-a > b-p:
for _ in range(b-p):
ans += "left of "
ans += name[b]
print(ans)
else:
print("middle of %s and %s" %(name[a],name[b]))
C++版本代码如下:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//#define ZANGFONG
const int maxn = 101;
int q[maxn];
char name[maxn][5];
int main()
{
#ifdef ZANGFONG
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // ZANGFONG
int n,i,j,k,l,a,b,qa;
memset(q,0,sizeof(q));
memset(name,0,sizeof(name));
scanf("%d\n",&n);
for(i = 1; i <= n; i++)
{
scanf("%s",&name[i]);
if(name[i][0] == '?') q[i] = 1;
}
scanf("%d\n",&qa);
while(qa--)
{
scanf("%d\n",&k);
if(q[k]==0) printf("%s\n",name[k]);
else
{
j = k;
while(q[j]==1 && j >= 1) j--;
a = j;
j = k;
while(q[j]==1 && j <= n) j++;
b = j;
if(a <= 0)
{
for(l = 0; l < b - k; l++) printf("left of ");
printf("%s\n",name[b]);
}
else if(b >= n)
{
for(l = 0; l < k - a; l++) printf("right of ");
printf("%s\n",name[a]);
}
else
{
if(k - a < b - k)
{
for(l = 0; l < k - a; l++) printf("right of ");
printf("%s\n",name[a]);
}
else if(k - a > b - k)
{
for(l = 0; l < b - k; l++) printf("left of ");
printf("%s\n",name[b]);
}
else printf("middle of %s and %s\n",name[a],name[b]);
}
}
}
return 0;
}