• 好老师 (第九届湖南大学计算机程序设计竞赛)


    1334: 好老师

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 267  Solved: 131
    [Submit][Status][Web Board]

    Description

    我想当一个好老师,所以我决定记住全部学生的名字。但是不久以后我就放弃了,由于学生太多了,根本记不住。但是我不能让我的学生发现这一点,否则会非常没面子。所以每次要叫学生的名字时。我会引用离他近期的,我认得的学生。

    比方有10个学生:

    A ? ? D ?

    ? ? H ?

    ?

    想叫每一个学生时。详细的叫法是:

    位置

    叫法

    1

    A

    2

    right of A (A右边的同学)

    3

    left of D (D左边的同学)

    4

    D

    5

    right of D (D右边的同学)

    6

    middle of D and H (D和H正中间的同学)

    7

    left of H (H左边的同学)

    8

    H

    9

    right of H (H右边的同学)

    10

    right of right of H (H右边的右边的同学)

    Input

    输入仅仅有一组数据。第一行是学生数n(1<=n<=100)。第二行是每一个学生的名字,依照从左到右的顺序给出。以空格分隔。

    每一个名字要么是不超过3个英文字母,要么是问号。

    至少有一个学生的名字不是问号。下一行是询问的个数q(1<=q<=100)。每组数据包括一个整数p(1<=p<=n),即要叫的学生所在的位置(左数第一个是位置1)。

    Output

    对于每一个询问。输出叫法。注意"middle of X and Y"仅仅有当被叫者有两个近期的已知学生X和Y,而且X在Y的左边。

    Sample Input

    10A ? ? D ? ? ?

    H ? ?

    438610

    Sample Output

    left of DHmiddle of D and Hright of right of H

    HINT

    一道水题。直接进行模拟,依照位置进行推断,输出询问,两边进行搜索;搜索到不为‘?’的值。

    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        char name[101][4];
        int n,i,q,p,left,right;
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%s",name[i]);
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d",&p);
            left=right=p;
            if(name[p][0]!='?') printf("%s
    ",name[p]);//直接就是询问的位置
            else
            {
                while(1)
                {
                    if(left-1>0)
                        left=left-1;
                    if(right+1<=n)
                        right=right+1;
                    if(name[left][0]!='?' && name[right][0]!='?')//在两个中间的情况
                    {
                        printf("middle of %s and %s
    ",name[left],name[right]);
                        break;
                    }
                     if(name[left][0]=='?' && name[right][0]!='?')//在左边的情况
                    {
                         for(i=1;i<=right-p;i++)//这里还要进行推断一下。可能会在左边的左边
                            printf("left of ");
                            printf("%s
    ",name[right]);
                          break;
                    }
                    if(name[left][0]!='?' && name[right][0]=='?

    ')//在右边的情况 { for(i=1;i<=p-left;i++) printf("right of "); printf("%s ",name[left]); break; } } } } return 0; }




    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    倒序数组的算法
    SQL 日期操作函数
    sp_executesql 练习
    c#编译器对byte类型的一些规则
    角度在excel中如何输入并使其能计算
    5天学会fx5800计算器测量编程(二) fx5800函数学习
    5天学会fx5800计算器测量编程(二) fx5800语法学习
    如何快速的将大地坐标系导入进施工结构的cad平面图纸中
    CAD中批量导入坐标和点号的方法命令
    5天学会fx5800计算器测量编程(一)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4649234.html
Copyright © 2020-2023  润新知