zoukankan      html  css  js  c++  java
  • 湖南省第九届大学生计算机程序设计竞赛1334: 好老师 (模拟)

     1334: 好老师
    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 647  Solved: 277
    [Submit][Status][Web Board]
    Description
    我想当一个好老师,所以我决定记住所有学生的名字。可是不久以后我就放弃了,因为学生太多了,根本记不住。但是我不能让我的学生发现这一点,否则会很没面子。所以每次要叫学生的名字时,我会引用离他最近的,我认得的学生。比如有10个学生:
    A ? ? D ? ? ? H ? ?
    想叫每个学生时,具体的叫法是:
    位置叫法
    1A
    2right of A (A右边的同学)
    3left of D (D左边的同学)
    4D
    5right of D (D右边的同学)
    6middle of D and H (D和H正中间的同学)
    7left of H (H左边的同学)
    8H
    9right of H (H右边的同学)
    10right 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
    10
    A ? ? D ? ? ? H ? ?
    4
    3
    8
    6
    10

    Sample Output
    left of D
    H
    middle of D and H
    right of right of H

    HINT
    Source
    湖南省第九届大学生计算机程序设计竞赛

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int i,j;
        int n,t;
        char num[105][5];
        int ans;
        scanf("%d",&n);
        for( i=1; i<=n; i++)
        {
            cin>>num[i];
        }
        cin>>t;
        while(t--)
        {
            i=1;
            j=1;
            cin>>ans;
            if(num[ans][0]!='?')
            {
                cout<<num[ans]<<endl;
            }
            else
            {
                while(1)
                {
    
                    if(ans-i<1)//必须先判断
                    {
                        //printf("!!!!
    ");
                         i=10000000;
                         break;
                    }
                    else if(num[ans-i][0]!='?')
                        break;
    
                    else
                        i++;
    
                }
                while(1)
                {
    
                    if(ans+j>n)
                    {
                        j=10000000;
                        break;
                    }
                    else if(num[ans+j][0]!='?')
                        break;
                    else
                        j++;
                }
                if(i==j)
                    printf("middle of %s and %s
    ",num[ans-i],num[ans+j]);
                else if(i<j&&num[ans-i][0]!='?')
                {
                    int mark=i;
                    while(mark--)
                         printf("right of ");
                    cout<<num[ans-i]<<endl;
                }
                else if(j<i&&num[ans+j][0]!='?')
                {
                    int mark=j;
                    while(mark--)
                       printf("left of ");
                    cout<<num[ans+j]<<endl;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    [转]字符串相似度算法(编辑距离算法 Levenshtein Distance)
    [转]Earth Mover's Distance (EMD)
    [转]相似度计算常用方法综述
    小和问题和逆序对问题
    递归的理解
    验证方法是否正确——对数器
    CSS的几个核心概念(复盘大纲~)
    CSS3过渡
    CSS经典布局
    CSS3边框和圆角
  • 原文地址:https://www.cnblogs.com/dshn/p/4750634.html
Copyright © 2011-2022 走看看