uva12662 Good Teacher

uva12662

uDebug12662

题意是说,有位老师,想当个能叫出所有学生名字的好老师,可是学生太多,有些学生的名字还是叫不出来。为了不让学生看出来,如果要点名那个叫不出名字的同学,就采取就近原则,找到最近的已知名字的同学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;
}

 

 


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值