noip2007 字符串的展开

开始做noip的套题。

做完这道题想把它记下来。题目不难,模拟即可,考察的是字符串的处理。

本题真正值得注意的是全面考虑问题,这也是noip模拟题重点考察的内容。包括noip 2003 侦探推理。

这两道题都是模拟,但是特判的情况很多。以本题为例,我没有考虑【两个--】的情况,【-在开头】的情况,和【字母-数字】,【数字-字母】的情况

而且数组大小估计错误,蹦了一个点。

第一编写完只有40分。

经过思考,加上了【-在开头】的情况,和【字母-数字】,【数字-字母】三种情况,70分;

最后比对数据,才意识到【两个--】的情况和超内存的问题,改后AC;

另外,当初侦探推理那道题写完只有20分,几乎是对照数据一个点一个点改过的。。。。= =

客观的说,这两道题的数据都是很科学的,每种情况都有对应的1、2个点,几乎是加一个特判过一个点。


总之,通过做此题,发现几个要注意的问题:

第一、认真审题,认真分析!!!!! 虽然老生常谈了,但是每次都会忽略。尤其是搜索和模拟,注意特判剪枝以及不合法情况!!!!!!

第二、仔细分析时间复杂度和空间复杂度。 其实说白了还是要认真分析问题。如果空间或时间分析错误就太可惜了。

第三、多做测试。不要以为题中的测试数据很强大。其实题中的数据通常蒟蒻!甚至会故意坑人。总之,要不怕麻烦,自己设计数据,而且要注意极端数据。

 

 

 

附带本题代码

View Code
 1 #include <stdio.h>

 2 #include <stdlib.h>

 3 #include <string.h>

 4 int a,b,c;

 5 char x[500000],t[500000];

 6 int main()

 7 {

 8     freopen("expand.in","r",stdin);

 9     freopen("expand.out","w",stdout);

10     scanf("%d%d%d",&a,&b,&c);

11     scanf("%s",x);

12     char temp[500000];

13     int e=strlen(x);

14     int i,j,k,w,s;

15     k=0;

16     for (i=0;i<e;i++)

17     {

18         if ('a'<=x[i]&&x[i]<='z') {t[k++]=x[i];}

19         if ('0'<=x[i]&&x[i]<='9') {t[k++]=x[i];}

20         if (x[i]=='-')

21         {

22             if (i==0)   {t[k++]=x[i];continue;}//////////

23             if (x[i-1]=='-')    {t[k++]=x[i];continue;}//////////

24             if (x[i-1]==x[i+1]-1)   continue;//do nothing

25             if (x[i-1]>=x[i+1]) {t[k++]=x[i];continue;}

26             if ('a'<=x[i-1]&&x[i-1]<='z'&&'0'<=x[i+1]&&x[i+1]<='9') {t[k++]=x[i];continue;}////////

27             if ('a'<=x[i+1]&&x[i+1]<='z'&&'0'<=x[i-1]&&x[i-1]<='9') {t[k++]=x[i];continue;}/////////

28             if (a==1)

29             {

30                 j=0;

31                 for (s=x[i-1]+1;s<x[i+1];s++)

32                     for (w=0;w<b;w++)

33                         temp[j++]=s;

34             }

35             if (a==2)

36             {

37                 j=0;

38                 if ('a'<=x[i-1]&&x[i-1]<='z')

39                     for (s=x[i-1]+1;s<x[i+1];s++)

40                         for (w=0;w<b;w++)

41                             temp[j++]=s-'a'+'A';

42                 if ('0'<=x[i-1]&&x[i-1]<='9')

43                     for (s=x[i-1]+1;s<x[i+1];s++)

44                         for (w=0;w<b;w++)

45                             temp[j++]=s;

46             }

47             if (a==3)

48             {

49                 j=0;

50                 for (s=x[i-1]+1;s<x[i+1];s++)

51                     for (w=0;w<b;w++)

52                         temp[j++]='*';

53             }

54             if (c==1)

55                 for (s=0;s<j;s++)

56                     t[k++]=temp[s];

57             if (c==2)

58                 for (s=j-1;s>=0;s--)

59                     t[k++]=temp[s];

60         }

61     }

62     for (i=0;i<k;i++)

63         printf("%c",t[i]);

64     printf("\n");

65     return 0;

66 }

其中加////////////的语句都是一开始没想到的。
That‘s all.

你可能感兴趣的:(2007)