2011BNU新生赛J题解题报告

来源:互联网 发布:人工智能eliza的结局 编辑:程序博客网 时间:2024/05/24 06:31
这个题可以说成是中等的字符串模拟题,由于这次有幸把我们院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;}