2011BNU新生赛J题解题报告

这个题可以说成是中等的字符串模拟题,由于这次有幸把我们院10级的拉来做新生赛了,所以就特意出了个化学题(当然去年也出了,当然还有道恶心的地理题给小舜萌猫喵准备的。貌似这个题是我出的三个题中最简单的一道??所以被选中了^_^Y),思路主要来源于我的化学专业英语的课本,翻译了其中的一段话就成了题面(^_^#)乍一看题面有点儿像新东方的词根词缀记忆法,没错我就是这么记的,而且我们平时小测验还考了(>_<),好吧言归正传给原子序数输出英文名还是比较好处理的,反过来就会有很多trick,我的做法是loc记录当前处理到的字符串的位置,strstr去找每个词根的位置,等于loc说明字符串中有这个词根,bi和tri不影响,关键就是nil在enn后面时要特别注意,所以遇到nil的i再往前退一个就好了。

赛后judge了下一些可以看到的同学的代码:发现小舜萌猫喵读错题了,un和nil在一起是不用处理的(从英文角度来讲ennnil很不和谐,unnil却可以忍)~~~然后戴神带来的小弟(rookie11-032)先是赛后怀疑明明出的题数据有问题,我这个题他竟然打了个14000+的表,有点儿我当年的“风采”,可以打的表我一眼就看出了错误(囧)rookie11-035 data2读不进来。。。不知为什么,然后他就TLE了,很可惜的是rookie11-043很可爱的忘把freopen去掉了,然后就WA了,不然他就1A了。我出题的目的当然是这个题可以AC,但1A是有难度滴,不过陆神在测题时1A了,强烈ORZ!!!!!!

#include <stdio.h>
#include <string.h>
char number[10][5]={"nil", "un", "bi", "tri", "quad", "pent", "hex", "sept", "oct", "enn",};
char a, b, c, element[20];
int t, flag;
int main()
{
    scanf ("%d", &t);
    while (t--){
      scanf ("%d", &flag);
      getchar();
      if (flag == 1){
        scanf ("%c%c%c", &a, &b, &c);
        printf("%c", number[a - '0'][0] - 'a' + 'A');
        if (a == '9' && b == '0') printf("%s%s", number[a - '0'] + 1, number[b - '0'] + 1);
        else printf("%s%s", number[a - '0'] + 1, number[b - '0']);
        if (b == '9' && c =='0') printf("%s%s\n", number[c - '0'] + 1, "ium");
        else if (c == '2' || c == '3') printf("%s%s\n", number[c - '0'], "um");
        else printf("%s%s\n", number[c - '0'], "ium");
      }
      if (flag == 2){
         scanf("%s", element);
         element[0] = element[0] - 'A' + 'a';
         int loc = 0, sum = 3;
         while(sum){
           int i = 0;
           for (; i <= 9; i++){
               printf("%");
             if (strstr(element + loc, number[i]) == (element + loc)){
                printf("%d", i);
                loc += strlen(number[i]);
                if(element[loc]=='i') loc--;
                --sum, i = 0;
             }
           }
         }
         printf("\n");
      }
    }
    return 0;
}


你可能感兴趣的:(2011BNU新生赛J题解题报告)