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.

posted @ 2012-06-06 20:43  wsc500  阅读(567)  评论(0编辑  收藏  举报